n-te Zahl mit n verschiedenen unterschiedlichen Primfaktoren

10

Erstellen Sie die kürzeste Funktion, das kürzeste Programm oder den kürzesten Ausdruck, der A073329 berechnet , dh a(n)die n-te Zahl mit n verschiedenen Primfaktoren. Eingabe ist die Anzahl der Elemente in der Sequenz, die zurückgegeben werden sollen. 0 < n. Ich bin nicht an ganzzahliger Präzision interessiert. Ich möchte nur den Algorithmus. Für Sprachen, die keine beliebig großen Ganzzahlen unterstützen, tun wir einfach so.

Sie finden Testfälle, indem Sie dem oben angegebenen Link zu OEIS folgen.

AKTUALISIEREN:

Lassen Sie mich klarstellen, dass Sie eine ganzzahlige Sequenz aus Ihrem Programm, Ihrer Funktion oder Ihrem Ausdruck zurückgeben müssen. Mit anderen Worten, f(x)sollte a(n)für alle nvon 1 bis berechnen x. Bei x8 sollte Ihre Funktion 2, 10, 60, 420, 4290, 53130, 903210, 17687670als Array oder eine andere geeignete Datenstruktur zurückgegeben werden.

Gregory Higley
quelle
Grenzen / Grenzen?
st0le
Ich beschäftige mich nicht wirklich mit Grenzen und Grenzen, aber wenn es für Sie wichtig ist, führen Sie den Algorithmus unter der Annahme aus, dass die Eingabe nicht mehr als 8 beträgt, und wir tun so, als würde er für höhere Zahlen funktionieren. Wie gesagt, ich interessiere mich für den abstrakten mathematischen Algorithmus, nicht für die Details der ganzzahligen Einschränkungen einer bestimmten Sprache.
Gregory Higley
1
Vielleicht ist es offener, wenn wir sagen: output a(1), ... a(n)anstatt etwas zurückzugeben, wie eine Reihe von ...
Benutzer unbekannt

Antworten:

2

Python, 144 Zeichen

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

Es dauert ungefähr 2 Minuten, bis x = 8 abgeschlossen ist.

Keith Randall
quelle
2

Java, 170 Zeichen in einer Zeile

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

Update, +77 Zeichen 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
quelle
Das ist eigentlich falsch, aber nah, obwohl ich denke, ich sollte meine Frage vielleicht klarer machen. Sie sollten eine ganzzahlige Sequenz zurückgeben. Wenn Sie beispielsweise den Eingang 8 eingeben, sollten Sie die ersten 8 Elemente in der Sequenz A073329 zurückgeben.
Gregory Higley
@ Gregory Blick auf Update
Cubanacan
Es tut mir leid - ich habe Sie aufgrund meines eigenen Missverständnisses der Aufgabe, das nach dem Lesen des OEIS-Links geklärt wurde, abgelehnt. Wenn Sie Ihren Beitrag geringfügig bearbeiten, kann und wird ich meine Ablehnung widerrufen.
Benutzer unbekannt
@ Benutzer wegen meines eigenen Missverständnisses Ihres Kommentars, klären Sie bitte Ihre Anfrage
Cubanacan
Ich habe die Frage falsch verstanden und dachte, alle Faktoren müssen unterschiedliche Primzahlen sein, also wäre 2 * 3 * 5 * 2 eine falsche Antwort. Also habe ich Ihre Antwort abgelehnt, weil sie falsch ist. Dann entdeckte ich, wie "verschiedene Primzahlen" zu verstehen sind, und wollte meine Abstimmung korrigieren, aber ich darf meine Abstimmung nicht ändern - es ist nur in den ersten Minuten möglich. Aber wenn Sie Ihre Antwort bearbeiten, kann ich meine Stimme ändern. Deshalb bitte ich Sie, nur ein wenig zu bearbeiten.
Benutzer unbekannt
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);
        }
    }
}

Verwendet einen Siebalgorithmus. Es ist ziemlich schnell. (6 Sekunden) Funktioniert bis zu genau, schlägt 8wahrscheinlich für etwas Höheres fehl.

st0le
quelle
1

JavaScript, 149 Zeichen

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}

Fühlt sich für n> = 6 nicht an, daher habe ich nicht getestet, wie lange es dauert (mein Browser zeigt etwa alle 10 Sekunden eine Benachrichtigung über ein blockiertes Skript an, daher kann ich die Zeit nicht genau messen und möchte nicht vollständig hängen bleiben, wenn ich dies tue Aktivieren Sie "Nicht mehr anzeigen" ...)

Bearbeiten: Um ein Array zurückzugeben, sind es 200 Zeichen (+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-
quelle
0

J, 32 Bytes

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

Aber da ich meine eigene Frage so spät beantworte, lassen wir diese Antwort nur als Kuriosität.

Gregory Higley
quelle