È un numero primo ... quasi


30

Se hai mai imparato a conoscere i numeri primi in classe di matematica, probabilmente avrai dovuto, a un certo punto, determinare se un numero è primo. Probabilmente hai fatto un casino mentre li stavi ancora imparando, ad esempio, scambiando 39 per un numero primo. Bene, non ti preoccupare, dato che 39 è un semiprime, cioè che è il prodotto di due numeri primi.

Allo stesso modo, possiamo definire un k -almost prime come il prodotto di k numeri primi. Ad esempio, 40 è il 4 ° 4-quasi primo; 40 = 5 * 2 * 2 * 2, il prodotto di 4 fattori.

Il vostro compito è quello di scrivere un programma / funzione che accetta due interi n e k come input e output / restituire il n ° k -quasi numero primo. Questo è un codice-golf, quindi vince il programma più breve in byte.

Casi test

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

miscellaneo

Devi generare tu stesso i numeri primi con qualsiasi mezzo diverso da una semplice forma chiusa, se esiste una tale forma chiusa.


Controlla la tua matematica nel tuo primo esempio: 40 non è uguale a 5 * 2 * 2 * 2 * 2.
GamrCorps,

@GamrCorps Ah, sì, grazie.
Conor O'Brien,

Come si definisce l' ennesimo k-quasi primo? Cosa determina l'ordine in cui si trovano i k-quasi primi?
GamrCorps,

3
Non credo che la tua espressione fin termini di f[n,1]sia corretta, poiché le liste di quasi-primi contengono numeri dispari (ad esempio gli ultimi due esempi, che non sono espressi come il prodotto di una potenza di due e un numero primo). (E lo dice anche f[n,1] == 2*f[n,1].)
Campion 2012,

1
Perché è vietato un semplice modulo chiuso?
Calcolatrice

Risposte:



5

Brachylog , 9 byte

Battere @sundar usando la metà di byte

{~l~ḋ}ᶠ⁽t

Spiegazione

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

Provalo online!


4

Pyke (commit 29), 8 byte (non competitivo)

.fPlQq)e

Spiegazione:

         - 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]

4

Julia, 84 78 59 57 byte

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

Questa è una funzione ricorsiva che accetta due numeri interi e restituisce un numero intero. L'approccio qui è quello di verificare la somma degli esponenti nella scomposizione in fattori primik .

Ungolfed:

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

4

Gelatina, 9 byte

ÆfL=³
ç#Ṫ

Provalo online!

Come funziona

Ç#Ṫ    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).

1
Non sono a conoscenza di alcuna codifica che può salvare questi 9 caratteri come 9 byte.
Oleh Prypin,

1
Jelly utilizza una codifica personalizzata che rappresenta il carattere 256 che comprende con singoli byte.
Dennis,

3

Brachylog , 18 byte

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

Provalo 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

1

Mathematica, 56 51 byte

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

Avvertenza: questo è teorico. Non eseguire per nessun valore> 4. Sostituisci 2 ^ ## con un'espressione più efficiente.


Questo non funziona per n=1.
IPoiler,

Anche dal momento che PrimeOmega[1]valuta 0, &&#>1è ridondante.
IPoiler,

1

Mathematica, 53 49 byte

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

Genera un elenco di numeri interi basati su un limite superiore libero. PrimeOmegaconta i fattori primi con molteplicità, il k -quasi primo Casessono tratti dalla lista, e la n viene restituito esimo membro di quel sottoinsieme.


2 ^ (0 + ##), o solo 2 ^ ## funziona.
Calcolatrice

@CatsAreFluffy Prova 2^Sequence[1,2]a capire perché quest'ultimo non riesce.
IPoiler,

1

Haskell, 88 byte

Probabilmente posso giocare a golf molto di più, dato che sono ancora un principiante di Haskell. La funzione qrestituisce il numero di fattori del suo argomento e lo futilizza per ottenere l' nthelemento di un elenco composto da tutti i numeri che hanno kfattori.

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

1

MATL, 14 byte

:YqiZ^!XpSu1G)

Provalo su 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

0

Python 3, 100 byte

Questa è una funzione di forza bruta molto semplice. Controlla ogni numero a partire da 2 con sympyla factorintfunzione fino a quando non trova i n kprimi primi, a quel punto la funzione restituisce il nth di questi.

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

Ungolfed:

Uso sum(factorint(a).values())perché factorintrestituisce un dizionario di factor: exponentcoppie. Afferrare i valori del dizionario (gli esponenti) e sommarli mi dice quanti fattori primi ci sono e quindi che cosa è kquesto kprimo quasi.

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

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.