n-ta liczba posiadająca n liczby różnych czynników pierwszych

10

Utwórz najkrótszą funkcję, program lub wyrażenie, które oblicza A073329 , tj. a(n)Jest n-tą liczbą mającą n różnych czynników pierwszych. Dane wejściowe to liczba elementów w sekwencji do zwrócenia. 0 < n. Nie interesuje mnie precyzja liczb całkowitych. Chcę tylko algorytmu. W przypadku języków, które nie obsługują dowolnie dużych liczb całkowitych, udajemy, że tak.

Przypadki testowe można znaleźć, klikając podany powyżej link do OEIS.

AKTUALIZACJA:

Pozwól, że wyjaśnię, że musisz zwrócić sekwencję całkowitą z programu, funkcji lub wyrażenia. Innymi słowy, f(x)należy obliczyć a(n)dla wszystkich nod 1 do x. Biorąc xpod uwagę 8, twoja funkcja powinna powrócić 2, 10, 60, 420, 4290, 53130, 903210, 17687670jako tablica lub inna odpowiednia struktura danych.

Gregory Higley
źródło
Granice / granice?
st0le
Tak naprawdę nie interesują mnie granice i granice, ale jeśli jest to dla ciebie ważne, wykonaj algorytm, zakładając, że dane wejściowe będą nie większe niż 8, i będziemy udawać, że działa dla wyższych liczb. Jak powiedziałem, interesuje mnie abstrakcyjny algorytm matematyczny, a nie szczegóły ograniczeń liczb całkowitych w danym języku.
Gregory Higley
1
Być może jest bardziej otwarty, kiedy mówimy: output a(1), ... a(n)zamiast zwracać coś, na przykład tablicę ...
użytkownik nieznany

Odpowiedzi:

2

Python, 144 znaki

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

Uruchomienie do ukończenia zajmuje około 2 minut dla x = 8.

Keith Randall
źródło
2

Java, 170 znaków w jednym wierszu

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

Aktualizacja, +77 znaków IOL

int[] f(int n) {
    int[] f = new int[n];
    for (int i = 0; i < n; i++) {
        f[i] = a(i+1);
    }
    return f;
}
kubanakan
źródło
To jest właściwie niepoprawne, ale bliskie, choć myślę, że powinienem wyjaśnić moje pytanie. Powinieneś zwrócić ciąg liczb całkowitych. Na przykład, jeśli wejście 8, powinieneś zwrócić pierwsze 8 elementów w sekwencji A073329.
Gregory Higley
@Gregory spójrz na aktualizację
cubanacan
Przepraszam - przegłosowałem cię, opierając się na własnym niezrozumieniu zadania, które wyjaśniłem po przeczytaniu linku OEIS. Jeśli dokonasz drobnych zmian w swoim poście, mogę i wycofam moje zdanie negatywne.
użytkownik nieznany
@ użytkownik z powodu mojego niezrozumienia twojego komentarza, proszę wyjaśnij swoją prośbę, proszę
cubanacan
Źle zrozumiałem pytanie i pomyślałem, że wszystkie czynniki muszą być odrębnymi liczbami pierwszymi, więc 2 * 3 * 5 * 2 byłoby błędną odpowiedzią. Więc głosowałem za odrzuceniem twojej odpowiedzi. Potem odkryłem, jak rozumieć „odrębne liczby pierwsze” i chciałem skorygować głosowanie, ale nie mogę zmienić głosu - jest to możliwe tylko w ciągu pierwszych kilku minut. Ale jeśli zredagujesz swoją odpowiedź, mogę zmienić mój głos. Więc proszę o odrobinę edycji.
użytkownik nieznany
2

Java (Unngolfed)

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

Wykorzystuje algorytm sita. To jest dość szybkie. (6 sekund) Będzie działać dokładnie dla upto 8, prawdopodobnie zawiedzie dla czegoś wyższego.

st0le
źródło
1

JavaScript, 149 znaków

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}

Nie odpowiada na n> = 6, więc nie sprawdziłem, ile czasu to zajmuje (moja przeglądarka wyświetla zawieszone powiadomienie skryptu co około 10 sekund, dlatego nie mogę dokładnie określić czasu i nie chcę się całkowicie zawiesić, jeśli zaznacz „nie pokazuj tego ponownie” ...)

Edycja: Aby zwrócić tablicę, ma 200 znaków (+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-
źródło
0

J, 32 bajty

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

Ale ponieważ odpowiadam na własne pytanie tak późno, zostawimy tę odpowiedź jako ciekawość.

Gregory Higley
źródło