Ile unikalnych liczb pierwszych?


14

Jednym ze sposobów przedstawienia liczby naturalnej jest pomnożenie wykładników liczb pierwszych. Na przykład 6 może być reprezentowane przez 2 ^ 1 * 3 ^ 1, a 50 może być reprezentowane przez 2 ^ 1 * 5 ^ 2 (gdzie ^ oznacza eksponencję). Liczba liczb pierwszych w tej reprezentacji może pomóc ustalić, czy użycie tej metody reprezentacji jest krótsze w porównaniu z innymi metodami. Ale ponieważ nie chcę ich obliczać ręcznie, potrzebuję programu, który to dla mnie zrobi. Ponieważ jednak muszę pamiętać program, dopóki nie wrócę do domu, musi on być jak najkrótszy.

Twoje zadanie:

Napisz program lub funkcję, aby określić, ile różnych liczb pierwszych znajduje się w tej reprezentacji liczby.

Wejście:

Liczba całkowita n taka, że ​​1 <n <10 ^ 12, przyjęta dowolną normalną metodą.

Wynik:

Liczba różnych liczb pierwszych wymaganych do przedstawienia danych wejściowych, zgodnie z opisem we wstępie.

Przypadki testowe:

24      -> 2 (2^3*3^1)
126     -> 3 (2^1*3^2*7^1)
1538493 -> 4 (3^1*11^1*23^1*2027^1)
123456  -> 3 (2^6*3^1*643^1)

To jest OEIS A001221 .

Punktacja:

To jest , najniższy wynik w bajtach wygrywa!


3
Ostatnio wiele głównych pytań! Kocham to.
Giuseppe,


3
Przyczyną przegłosowania może być jego trywialność. O ile mogłem zobaczyć, istnieją 3 sytuacje, jeśli chodzi o języki gry w golfa: 1. wbudowany 2. łańcuch dwóch wbudowanych 3. łańcuch 3 wbudowanych (osobiście mam trzy 2-bajtowe odpowiedzi); Nie wiem, czy to jest dobry powód do przegłosowania, ale jest to możliwa przyczyna
Pan Xcoder,

1
Być może, ale byłbym wdzięczny, gdyby jeden z trzech downvoters skomentował mi to. Chociaż jest to banalne w językach golfowych, istnieje kilka interesujących rozwiązań w językach innych niż golfowe, które chciałem zobaczyć, kiedy opublikowałem to wyzwanie. W końcu na stronie jest wiele wyzwań, które są trywialne dla golflangów, ale dają ciekawe rozwiązania inne niż golflang.
Gryphon

1
Korzystne byłoby włączenie liczby pierwszej w przypadkach testowych. Ponadto niektóre języki / podejścia są trudne do przetestowania pod kątem dużych liczb. Przydałoby się kilka mniejszych przypadków testowych.
Dennis,

Odpowiedzi:


6

MATL , 4 3 bajty

-1 bajt dzięki Luis Mendo

YFz

Wypróbuj online!

YF         Exponents of prime factors
  z        Number of nonzeros

Oryginalna odpowiedź:

Yfun

Wypróbuj online!

Ver Yfunodpowiedź.

          (Implicit input)
Yf         Prime factorization
  u        Unique
   n       Numel
           (Implicit output)

1
Dlaczego warto się bawić? - ;-)
Adám

1
Przekreślone 4 jest nadal regularne 4
Gryphon

5

05AB1E , 2 bajty

kolejna dość nudna odpowiedź ...

fg

Pełny program akceptujący wprowadzanie numeryczne i drukujący wynik

Wypróbuj online!

W jaki sposób?

fg - implicitly take input
f  - get the prime factors with no duplicates
 g - get the length
   - implicit print

5

Mathematica, 7 bajtów

PrimeNu

Tak, jest wbudowany.

Mathematica, 21 bajtów

Length@*FactorInteger

Długa droga dookoła.


Jaki jest powód gwiazdki? Czy to nie Length@FactorIntegerto samo?
numbermaniac,

1
Length@*FactorIntegertworzy czystą funkcję: skład Lengthi FactorInteger. Mogę zdefiniować, fun=Length@*FactorIntegera następnie zadzwonić fun[1001]. Z drugiej strony Length@FactorIntegeroznaczałoby Length[FactorInteger]i oceniałoby to 0.
Misza Ławrow


4

Python 2, 56 bajtów

f=lambda n,p=2,k=1:n/p and[f(n,p+1),k+f(n/p,p,0)][n%p<1]

Czy to jest przypadek odpowiedzi Dennisa tutaj ?
Jonathan Allan

1
@JonathanAllan Tak, zmodyfikowano tak, aby liczyć unikalne czynniki pierwsze.
orlp

4

Retina , 31 30 bajtów

&`(?!(11+)\1+$)(11+)$(?<=^\2+)

Dane wejściowe są jednostkowe.

Dzięki @MartinEnder za grę w golfa 1 bajt!

Wypróbuj online!(obejmuje konwerter dziesiętny na unarny)

Jak to działa

Ponieważ program składa się z jednego wyrażenia regularnego z &modyfikatorem, Retina po prostu liczy liczbę nakładających się dopasowań. Zakłada się, że dane wejściowe składają się z n powtórzeń 1 i nic więcej.

Negatywne spojrzenie w przyszłość

(?!(11+)\1+$)

dopasowania w miejscach między 1 , po których nie występują dwa lub więcej 1 ( 11+), po których następuje jedno lub więcej powtórzeń o tej samej ilości 1 ( \1+), a następnie koniec wprowadzania ( $).

Dowolna liczba kompozytu AB z a, b> 1 może być zapisana jako b powtórzeń a powtórzeń 1 , tak uprzedzona pasuje tylko miejsca następnie p powtórzeń 1 , gdzie p = 1 lub p jest liczbą pierwszą.

Wyrażenie regularne

(11+)$

upewnia się, że p> 1 , wymagając co najmniej dwóch 1 's ( 11+) i przechowuje ogon 1 ' w drugiej grupie przechwytywania ( \2).

Wreszcie pozytywny wygląd

(?<=^\2+)

sprawdza, czy całe dane wejściowe składają się z wystąpień kp ( k ≥ 1 ) z 1 , sprawdzając, czy p dzieli dane wejściowe.

Zatem każde dopasowanie odpowiada unikalnemu dzielnikowi głównemu p .


4

Narzędzia Bash + GNU, 33

  • 1 bajt zapisany dzięki @Dennis
factor|grep -Po ' \d+'|uniq|wc -l

Wypróbuj online .

Wyjaśnienie

factor|                            # Split input into prime factors
       grep -Po ' \d+'|            # group factors onto lines
                       uniq|       # remove duplicates
                            wc -l  # count the lines

1
grep -Po ' \d+'oszczędza bajt tr \ \\n|sed 1d.
Dennis,

Niestety grep -Po '( \d+)\1*'nie udaje się wprowadzić danych 46 .
Dennis,

@Dennis dzięki - Naprawiłem to używając twojej oryginalnej sugestii
Digital Trauma

3

Galaretka , 3 bajty

dość nudna odpowiedź ...

ÆFL

Monadyczny link pobierający numer i zwracający numer

Wypróbuj online!

W jaki sposób?

ÆFL - Link: number, n
ÆF  - prime factorisation as a list of prime, exponent pairs
  L - length

1
Jak tęskniłeś Æv?
mój zaimek to monicareinstate

To było łatwe - nigdy nie miałem z tego powodu pożytku i nie przeszukiwałem listy na wiki.
Jonathan Allan

Jak wpisywać galaretki bez listy atomów i listy szybkich?
mój zaimek to monicareinstate

1. Æjest kodem alt 0198. 2. Możesz skonfigurować klawiaturę (nie mam). 3. Strona kodowa.
Jonathan Allan



3

Alice , 10 bajtów

/o
\i@/Dcd

Wypróbuj online!

Wyjaśnienie

/o
\i@/...

To tylko standardowa platforma dla liniowych programów obciążonych arytmetyką, które wymagają dziesiętnych operacji we / wy. Właściwy program jest wtedy po prostu:

Dcd

Co robi:

D    Deduplicate prime factors. Does what it sounds like: for every p^k which
     is a divisor n, this divides n by p^(k-1).
c    Push the individual prime factors of n. Since we've deduplicated them
     first, the number of factors is equal to the value we're looking for.
d    Push the stack depth, i.e. the number of unique prime factors.

3

JavaScript 45 bajtów

* W przypadku @SEJPM poproś o wyjaśnienie: to, co tutaj robię, to od 2 - n (które się zmieni, i ostatecznie będzie największym czynnikiem podstawowym) - teraz, jeśli bieżąca liczba dzieli, chcę ją policzyć tylko raz (nawet chociaż może to być współczynnik 2 * 2 * 2 * 3 - 2 jest liczone raz) - więc na obraz pojawia się „j”, gdy j nie jest określone w wywołaniu funcion - j otrzyma wartość „ undefined ", a gdy n% i == 0, wtedy wywołuję funkcję z j = 1 w następnym wywołaniu) - a następnie dodaję tylko 1, gdy j jest niezdefiniowany, co jest! j + Funkcja (n / i, i, ( j = 1 lub tylko 1)). nie zmieniam i w tej kwestii, ponieważ może nadal być podzielne przez i ponownie (2 * 2 * 3), ale wtedy j będzie równe 1 i nie będzie się liczyło jako czynnik. mam nadzieję, że wyjaśniłem to wystarczająco dobrze.

P=(n,i=2,j)=>i>n?0:n%i?P(n,i+1):!j+P(n/i,i,1)

console.log(P(1538493)==4);
console.log(P(24)==2);
console.log(P(126)==3);
console.log(P(123456)==3);

jeśli ostatnia liczba pierwsza jest bardzo duża, to będzie miała maksymalny stos wywołań - jeśli jest to problem, mogę zrobić iteracyjny


Czy mógłbyś napisać wyjaśnienie tej odpowiedzi? Wydaje się, że stosuje zwykłe podejście z pozostałych odpowiedzi.
SEJPM,

@ SEJPM dodałem tam wyjaśnienie
DanielIndie

1
Do Twojej wiadomości możemy założyć nieskończone stosy połączeń / nieskończone zasoby dla większości wyzwań związanych z golfem (zasadniczo, chyba że pytanie stanowi inaczej).
Jonathan Allan,








2

R + numbers, 30 14 bytes

16 bytes removed thanks to @Giuseppe

numbers::omega

Also, here is the Try it online!! link per @Giuseppe.


You may omit the f=function(x) and the (x) as numbers::omega is a function already. However, as numbers is not standard for R, you should make your answer "R + numbers". Also, you should include a TIO link. Still, +1, very nice.
Giuseppe

@Giuseppe, you are too nice. Thanks for your help. BTW, in addition to some of your insightful answers, I checked out Tips for golfing in R, as you suggested. There are some real gems there. Anywho, I will update my answer with your recommendations. Also, your MATL solution is very nice (+1 yesterday).
Joseph Wood

NP, feel free to ping me in chat or comment on an answer of mine if you have questions.
Giuseppe

@Giuseppe is there a meta consensus on needing to explicitly state "R + numbers"? It seems like if we state the additional package then we should be able to save the bytes of explicitly calling it with numbers::. Otherwise, to me it's the same as using an import in any other language.
BLT

(scrolls down and sees a python example of this...) I guess I'm wondering about a broader meta consensus, then. It just sort of seems silly to me.
BLT



1

Haskell, 58 bytes

-4 bytes thanks to @Laikoni

f n=sum[1|x<-[2..n],gcd x n>1,all((>)2.gcd x)[2..x-1]]

Try it online!

Explanation

Essentially generates all primes at most as large as n and filters them for being a factor of n and then takes the length of the result.

f n=                                                   -- main function
    sum[                                             ] -- output the length of the list
        1|x<-[2..n],                                   -- consider all potential primes <=n
                                                       -- and insert 1 into the list if predicates are satisfied
                    gcd x n>1,                         -- which are a factor of n
                              all(          )[2..x-1]  -- and for which all smaller numbers satisfy
                                  (>)2.                -- 2 being larger than
                                       gcd x           -- the gcd of x with the current smaller number

You can use sum[1|x<- ... ] instead of length.
Laikoni


1

ARBLE, 28 bytes

len(unique(primefactors(n)))

Try it online!

This is a very literal solution


I was looking at this and going "Hey, wait a minute, this is a snippet!" And then I see... is this supposed to be a non-esoteric language with implicit IO?!
totallyhuman

@icrieverytim Congratulations, you have discovered one of the main reasons this language exists.
ATaco


0

Python 2,  63  55 bytes

A much more interesting answer...

-8 bytes thanks to Jonathan Frech (use an argument with a default for the post-adjustment of the result of primes from 0 to 1 -- much better than a wrapping lambda!!)

f=lambda n,o=1:sum(n%i+f(i,0)<1for i in range(2,n))or o

A recursive function taking a positive integer, n, and returning a positive integer, the count.

Try it online! Really inefficient, don't even bother with the other test cases.



@JonathanFrech Thanks, that is much cleaner.
Jonathan Allan

0

J, 12 bytes

{:@$@(__&q:)

q: is J's prime exponents function, giving it the argument __ produces a matrix whose first row is all nonzero prime factors and whose 2nd row is their exponents.

We take the shape $ of that matrix -- rows by columns -- the number of columns is the answer we seek.

{: gives us the last item of this two items (num rows, num columns) list, and hence the answer.

Try it online!



0

Javascript ES6, 56 chars

n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)

Test:

f=n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)
console.log([24,126,1538493,123456].map(f)=="2,3,4,3")

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.