ennesimo numero con n numero di fattori primi distinti


10

Crea la funzione, il programma o l'espressione più breve che calcola A073329 , ovvero a(n)è l' ennesimo numero con n fattori primi distinti. Input è il numero di elementi nella sequenza da restituire. 0 < n. Non mi preoccupo della precisione dei numeri interi. Voglio solo l'algoritmo. Per le lingue che non supportano numeri interi arbitrariamente grandi, faremo semplicemente finta di sì.

Puoi trovare i casi di test seguendo il link a OEIS sopra indicato.

AGGIORNARE:

Consentitemi di chiarire che è necessario restituire una sequenza intera dal programma, dalla funzione o dall'espressione. In altre parole, f(x)dovrebbe calcolare a(n)per tutti nda 1 a x. Dato x8, la tua funzione dovrebbe tornare 2, 10, 60, 420, 4290, 53130, 903210, 17687670come un array o qualche altra struttura di dati appropriata.


Limiti / limiti ??
st0le

Non mi occupo davvero di limiti e limiti, ma se è importante per te, fai in modo che l'algoritmo supponga che l'input non sia più di 8 e facciamo finta che funzioni per numeri più alti. Come ho detto, sono interessato all'algoritmo matematico astratto, non ai dettagli delle limitazioni intere di un particolare linguaggio.
Gregory Higley,

1
Forse è più aperto, quando diciamo: output a(1), ... a(n)invece di restituire qualcosa, come una matrice di ...
utente sconosciuto

Risposte:


2

Python, 144 caratteri

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

Sono necessari circa 2 minuti per il completamento per x = 8.


2

Java, 170 caratteri in una riga

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;
}

Aggiornamento, +77 caratteri IOL

int[] f(int n) {
    int[] f = new int[n];
    for (int i = 0; i < n; i++) {
        f[i] = a(i+1);
    }
    return f;
}

Questo in realtà non è corretto, ma vicino, anche se penso che dovrei forse chiarire la mia domanda. Dovresti restituire una sequenza intera. Ad esempio, se l'ingresso 8, è necessario restituire i primi 8 elementi nella sequenza A073329.
Gregory Higley,

@Gregory guarda l'aggiornamento
cubanacan,

Mi dispiace - ti ho votato in base al mio malinteso sul compito, che è stato chiarito dopo aver letto il link OEIS. Se fai una modifica minore del tuo post, posso e revocherò il mio downvote.
utente sconosciuto

@utente a causa del mio malinteso sul tuo commento, chiarisci la tua richiesta, per favore
cubanacan

Ho frainteso la domanda e ho pensato che tutti i fattori devono essere numeri primi distinti, quindi 2 * 3 * 5 * 2 sarebbe una risposta sbagliata. Quindi ho votato la tua risposta per essere falsa. Poi ho scoperto come comprendere i "numeri primi distinti" e volevo correggere il mio voto, ma non mi è permesso cambiare il mio voto - è possibile solo nel primo, pochi minuti. Ma se modifichi la tua risposta, posso cambiare il mio voto. Quindi ti sto chiedendo di modificare solo un po '.
utente sconosciuto

2

Java (Ungolfed)

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);
        }
    }
}

Utilizza un algoritmo di setaccio. È abbastanza veloce. (6 secondi) Funzionerà con precisione fino a 8, probabilmente fallirà per qualcosa di più alto.


1

JavaScript, 149 caratteri

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}

Non risponde per n> = 6, quindi non ho testato quanto tempo impiega (il mio browser fa apparire una notifica di script sospesa ogni 10 secondi circa, quindi non posso cronometrarlo accuratamente e non voglio bloccarmi completamente se seleziona "non mostrare più" ...)

Modifica: per restituire un array di 200 caratteri (+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}

0

J, 32 byte

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

Ma dal momento che sto rispondendo alla mia domanda così tardi, lasceremo questa risposta solo come una curiosità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.