To liczba pierwsza… prawie

30

Jeśli kiedykolwiek nauczyłeś się liczb pierwszych w klasie matematycznej, prawdopodobnie w pewnym momencie musiałeś ustalić, czy liczba jest liczbą pierwszą. Prawdopodobnie popełniłeś błąd podczas nauki, na przykład myląc 39 z liczbą pierwszą. Cóż, nie martw się, ponieważ 39 jest półpierwszym, tzn. Że jest iloczynem dwóch liczb pierwszych.

Podobnie możemy zdefiniować k- prawie pierwszą jako iloczyn k liczb pierwszych. Na przykład 40 to czwarta czwarta prawie prawie pierwsza; 40 = 5 * 2 * 2 * 2, iloczyn 4 czynników.

Twoim zadaniem jest napisanie programu / funkcji, która przyjmuje dwie liczby całkowite n i k jako dane wejściowe i wyjściowe / zwraca n-k -najbliższą liczbę pierwszą. To jest golf golfowy, więc wygrywa najkrótszy program w bajtach.

Przypadki testowe

n, k => output
n, 1 => the nth prime number
1, 1 => 2
3, 1 => 5
1, 2 => 4
3, 2 => 9
5, 3 => 27

Różne

Musisz wygenerować liczby pierwsze w jakikolwiek inny sposób niż prosty formularz zamknięty, jeśli taki formularz zamknięty istnieje.

Conor O'Brien
źródło
Sprawdź swoją matematykę w pierwszym przykładzie: 40 nie jest równe 5 * 2 * 2 * 2 * 2.
GamrCorps
@GrrCorps Ach, tak, dziękuję.
Conor O'Brien
Jak zdefiniujesz n - liczbę pierwszą k-prawie? Co decyduje o tym, w jakiej kolejności są liczby pierwsze k-prawie?
GamrCorps
3
Nie sądzę, aby twoje wyrażenie fpod względem f[n,1]było poprawne, ponieważ listy liczb prawie pierwszych zawierają liczby nieparzyste (np. Dwa ostatnie przykłady, których nie można wyrazić jako iloczyn potęgi dwóch i liczby pierwszej). (I to też mówi f[n,1] == 2*f[n,1].)
2012rcampion
1
Dlaczego prosty, zamknięty formularz jest zbanowany?
CalculatorFeline

Odpowiedzi:

5

Brachylog , 9 bajtów

Pokonanie @sundar przy użyciu o połowę mniej bajtów

{~l~ḋ}ᶠ⁽t

Wyjaśnienie

                    --  Input like [n,k]
{    }ᶠ⁽            --      Find the first n values which
   ~ḋ               --          have a prime decomposition
 ~l                 --          of length k
        t           --      and take the last one

Wypróbuj online!

Kroppeb
źródło
4

Pyke (zatwierdzenie 29), 8 bajtów (niekonkurencyjny)

.fPlQq)e

Wyjaśnienie:

         - autoassign Q = eval_or_not(input())
.f    )  - First eval_or_not(input) of (^ for i in range(inf))
  P      -    prime_factors(i)
   l     -   len(^)
     q   -  ^==V
    Q    -   Q
       e - ^[-1]
niebieski
źródło
4

Julia, 84 78 59 57 bajtów

f(n,k,i=1)=n>0?f(n-(sum(values(factor(i)))==k),k,i+1):i-1

Jest to funkcja rekurencyjna, która przyjmuje dwie liczby całkowite i zwraca liczbę całkowitą. Podejście polega tutaj na sprawdzeniu sumy wykładników wykładnika pierwszego względem k.

Nie golfowany:

function f(n, k, i=1)
    # We initialize a counter i as a function argument.

    # Recurse while we've encountered fewer than n k-almost primes
    if n > 0
        # If the sum of the exponents in the prime factorization of i is
        # equal to k, there are k prime factors of i. We subtract a boolean
        # from n, which is implicitly cast to an integer, which will
        # decrement n if i is k-almost prime and leave it as is otherwise.
        return f(n - (sum(values(factor(i))) == k), k, i + 1)
    else
        # Otherwise we return i-1 (i will have been incremented one too
        # many times, hence the -1)
        return i - 1
    end
end
Alex A.
źródło
4

Galaretka, 9 bajtów

ÆfL=³
ç#Ṫ

Wypróbuj online!

Jak to działa

Ç#Ṫ    Main link. Left input: k. Right input: n.

Ç      Apply the helper link to k, k + 1, k + 2, ... until...
 #       n matches are found.
  Ṫ    Retrieve the last match.


ÆfL=³  Helper link. Left argument: k (iterator)

Æf     Yield the prime factors of k.
  L    Compute the length of the list, i.e., the number of prime factors.
   =³  Compare the result with k (left input).
Dennis
źródło
1
Nie znam żadnego kodowania, które mogłoby zapisać te 9 znaków jako 9 bajtów.
Oleh Prypin
1
Jelly używa niestandardowego kodowania, które reprezentuje 256 znaków, które rozumie z pojedynczymi bajtami.
Dennis
3

Brachylog , 18 bajtów

,1{hH&t<NḋlH;N}ⁱ⁽t

Wypróbuj online!

                      Implicit input, say [5, 3]
,1                    Append 1 to the input list. [5, 3, 1]
  {           }ⁱ⁽     Repeat this predicate the number of times given by
                        the first element of the list (5),
                        on the rest of the list [3, 1]
   hH&                Let's call the first element H
      t<N             There is a number N greater than the second element
         ḋ            Whose prime factorization's
          l           length
           H          is equal to H
            ;N        Then, pair that N with H and let that be input for
                      the next iteration
                 t    At the end of iterations, take the last N
                      This is implicitly the output
sundar - Przywróć Monikę
źródło
1

Mathematica, 56 51 bajtów

Last@Select[Range[2^##],PrimeOmega@#==n&/.n->#2,#]&

Ostrzeżenie: jest to teoretyczne. Nie uruchamiaj dla żadnych wartości> 4. Zamień 2 ^ ## na bardziej wydajne wyrażenie.

CalculatorFeline
źródło
To nie działa dla n=1.
IPoiler
Również ponieważ PrimeOmega[1]ocenia na 0, &&#>1jest zbędne.
IPoiler
1

Mathematica, 53 49 bajtów

Cases[Range[2^(#2+#)],x_/;PrimeOmega@x==#2][[#]]&

Generuje listę liczb całkowitych na podstawie luźnej górnej granicy. PrimeOmegazlicza czynniki pierwsze z krotnością, k- pierwsza liczba pierwsza Casesjest pobierana z listy, a zwracany jest n- ty członek tego podzbioru.

IPoiler
źródło
2 ^ (0 + ##) lub tylko 2 ^ ## działa.
CalculatorFeline
@CatsAreFluffy Spróbuj 2^Sequence[1,2]dowiedzieć się, dlaczego to drugie zawodzi.
IPoiler
1

Haskell, 88 bajtów

Prawdopodobnie można grać w golfa o wiele więcej, ponieważ wciąż jestem nowicjuszem w Haskell. Funkcja qzwraca liczbę czynników swojego argumentu i fwykorzystuje ją do pobrania nthelementu listy utworzonej ze wszystkich liczb zawierających kczynniki.

q n|n<2=0|1>0=1+q(div n ([x|x<-[2..],mod n x<1]!!0))
f n k=filter(\m->q m==k)[1..]!!n-1
wada
źródło
1

MATL, 14 bajtów

:YqiZ^!XpSu1G)

Wypróbuj na MATL Online

:               % Take first input n implicitly, make range 1 to n
 Yq             % Get corresponding prime numbers (1st prime to nth prime)
   i            % Take the second input k
    Z^          % Take the k-th cartesian power of the primes list 
                % (Getting all combinations of k primes)
      !Xp       % Multiply each combination (2*2*2, 2*2*3, 2*2*5, ...)
         Su     % Sort and unique
           1G)  % Take the n-th element of the result
sundar - Przywróć Monikę
źródło
0

Python 3, 100 bajtów

Jest to bardzo prosta funkcja brutalnej siły. Sprawdza każdy numer począwszy od 2 z sympy„s factorintfunkcję aż znalazła n k-almost liczb pierwszych, w którym momencie, funkcja zwraca nth z nich.

import sympy
def a(n,k):
 z=1;c=0
 while c<n:z+=1;c+=(sum(sympy.factorint(z).values())==k)
 return z

Nie golfowany:

Używam, sum(factorint(a).values())ponieważ factorintzwraca słownik factor: exponentpar. Chwytanie wartości słownika (wykładników) i ich sumowanie mówi mi, ile jest czynników pierwszych, a co za ktym idzie k- prawie pierwsza.

from sympy import factorint
def almost(n, k):
    z = 1
    count = 0
    while count < n: 
        z += 1
        if sum(factorint(a).values()) == k:
            count += 1
    return z
Sherlock9
źródło
0

Python 2 , 76 bajtów

f=lambda n,k,p=2,c=0:c==k if p>n else f(n,k,p+1,c)if n%p else f(n/p,k,p,c+1)

Wypróbuj online!

Chas Brown
źródło