enésimo número com n número de fatores primos distintos

10

Crie a menor função, programa ou expressão que calcule A073329 , ou seja, a(n)é o enésimo número que possui n fatores primos distintos. Entrada é o número de elementos na sequência a retornar. 0 < n. Não estou preocupado com a precisão inteira. Eu só quero o algoritmo. Para idiomas que não suportam números inteiros arbitrariamente grandes, fingiremos que sim.

Você pode encontrar casos de teste seguindo o link para o OEIS fornecido acima.

ATUALIZAR:

Deixe-me esclarecer que você precisa retornar uma sequência inteira do seu programa, função ou expressão. Em outras palavras, f(x)deve calcular a(n)para todos nde 1 a x. Dado x8, sua função deve retornar 2, 10, 60, 420, 4290, 53130, 903210, 17687670como uma matriz ou outra estrutura de dados apropriada.

Gregory Higley
fonte
Limites / limites ??
st0le 16/05
Eu não estou realmente preocupado com limites e limites, mas se for importante para você, faça o algoritmo assumindo que a entrada não terá mais que 8 e fingiremos que funciona para números maiores. Como eu disse, estou interessado no algoritmo matemático abstrato, não nos detalhes das limitações inteiras de uma determinada linguagem.
Gregory Higley 16/05
11
Talvez seja mais aberto, quando dizemos: output a(1), ... a(n)em vez de retorno algo, como um conjunto de ...
desconhecido usuário

Respostas:

2

Python, 144 caracteres

R=range
P=[x for x in R(2,99)if all(x%i for i in R(2,x))]
for a in R(input()):
 x=n=0
 while n<=a:n+=sum(x%p==0for p in P)==a+1;x+=1
 print x-1

Demora cerca de 2 minutos para concluir até x = 8.

Keith Randall
fonte
2

Java, 170 caracteres em uma linha

int a(int n) {
    int a = 2, t = a, m = 1, i = 1;
    Set s = new HashSet();
    while (i++ > 0) {
        if (t % i == 0) {
            s.add(i);
            t /= i;
            if (t == 1) {
                if (s.size() == n) {
                    if (n == m) {
                        break;
                    }
                    m++;
                }
                t = ++a;
                s.clear();
            }
            i = 1;
        }
    }
    return a;
}

Atualização, +77 caracteres IOL

int[] f(int n) {
    int[] f = new int[n];
    for (int i = 0; i < n; i++) {
        f[i] = a(i+1);
    }
    return f;
}
cubanacan
fonte
Isso é realmente incorreto, mas íntimo, embora eu ache que talvez deva deixar minha pergunta mais clara. Você deve retornar uma sequência inteira. Por exemplo, se a entrada 8, você deve retornar os 8 primeiros elementos na sequência A073329.
Gregory Higley 17/05
@Gregory look at update
cubanacan
Sinto muito - votei contra você, com base no meu próprio mal-entendido da tarefa, que foi esclarecido após a leitura do link OEIS. Se você fizer uma edição menor de sua postagem, eu posso e revogarei meu voto negativo.
usuário desconhecido
@user por causa da minha própria incompreensão do seu comentário, esclarecer o seu pedido, por favor
Cubanacan
Não entendi bem a pergunta e pensei que todos os fatores devem ser números primos distintos; portanto, 2 * 3 * 5 * 2 seria uma resposta errada. Então votei sua resposta por ser falsa. Então eu descobri como 'primos distintos' é entender e queria corrigir minha votação, mas não tenho permissão para alterar meu voto - só é possível nos primeiros minutos. Mas se você editar sua resposta, eu posso mudar meu voto. Então, eu estou pedindo para você editar um pouco.
usuário desconhecido
2

Java (Sem Golfe)

public class M {

    public static void main(String[] a) {
        final int N = 100000000;
        int[] p = new int[N];
        for(int f = 2; f * f < N; f++) {
            if(p[f] == 0)
                for(int k = f; k < N; k += f)
                    p[k]++;
        }
        for(int i = 1; i <= 8; i++) {
            int c = 0, j;
            for(j = 1; j < N && c < i; j++)
                if(p[j] == i)
                    c++;
            if(c == i)
                System.out.println(i + " = " + --j);
        }
    }
}

Usa um algoritmo de peneira. É bem rápido. (6 segundos) Trabalhará com precisão até 8, provavelmente falhará em algo mais alto.

st0le
fonte
1

JavaScript, 149 caracteres

function(n){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)f(++i).length==n?c++:0;return i}

Parece não responder por n> = 6, então não testei quanto tempo leva (meu navegador exibe uma notificação de script interrompida a cada 10 segundos ou mais, portanto, não posso cronometrar com precisão e não quero travar completamente se eu marque "não mostrar isso de novo" ...)

Editar: para retornar a matriz, são 200 caracteres (+51) :

function(n){function F(){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)F(++i).length==n?c++:0;return i}for(a=[];n>0;n--)a.push(f());return a}
Ry-
fonte
0

J, 32 bytes

({"0 1~i.@#)(]/.~#@~.@q:)

Mas como estou respondendo minha pergunta tão tarde, deixaremos essa resposta como uma curiosidade.

Gregory Higley
fonte