Hipoteza Goldbacha stwierdza, że każdą liczbę parzystą większą niż dwa można wyrazić jako sumę dwóch liczb pierwszych. Na przykład,
4 = 2 + 2
6 = 3 + 3
8 = 5 + 3
Gdy jednak dojdziemy do 10, dzieje się coś ciekawego. Nie tylko 10 można zapisać jako
5 + 5
ale można to również zapisać jako
7 + 3
Ponieważ 10 można wyrazić jako sumę dwóch liczb pierwszych na dwa sposoby , mówimy, że „partycja Goldbacha” wynosi 10 2
. Lub bardziej ogólnie
Podział liczbowy Goldbacha to całkowita liczba różnych sposobów pisania
n = p + q
gdziep
iq
są liczbami pierwszymi ip >= q
Twoim wyzwaniem jest napisanie programu lub funkcji, która znajdzie partycję Goldbacha liczby. Obecnie technicznie termin „partycja Goldbacha” jest używany tylko w odniesieniu do liczb parzystych. Ponieważ jednak nieparzysta liczba całkowita p + 2 może być również wyrażona jako suma dwóch liczb pierwszych, jeśli p> 2 jest liczbą pierwszą, rozszerzymy ją na wszystkie liczby całkowite dodatnie ( A061358 ).
Możesz bezpiecznie założyć, że dane wejściowe będą zawsze dodatnimi liczbami całkowitymi i możesz pobierać dane wejściowe i wyjściowe dowolną z naszych domyślnych dozwolonych metod , na przykład argumentów funkcji i zwracanej wartości, STDIN i STDOUT, odczytywanie i zapisywanie do pliku itp.
Podziały Goldbach dodatnich liczb całkowitych do 100 to:
0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 2, 0, 2, 1, 2, 1, 3, 0, 3, 1,
3, 0, 2, 0, 3, 1, 2, 1, 4, 0, 4, 0, 2, 1, 3, 0, 4, 1, 3, 1, 4, 0, 5, 1, 4,
0, 3, 0, 5, 1, 3, 0, 4, 0, 6, 1, 3, 1, 5, 0, 6, 0, 2, 1, 5, 0, 6, 1, 5, 1,
5, 0, 7, 0, 4, 1, 5, 0, 8, 1, 5, 0, 4, 0, 9, 1, 4, 0, 5, 0, 7, 0, 3, 1, 6
Jak zwykle obowiązują standardowe luki i wygrywa najkrótsza odpowiedź w bajtach!
Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Python 2, 76 bajtów
Rekurencyjnie indeksuje się od
k=2
celun/2
, sumując wartości gdzie zarównok
in-k
są głównymi. Byłoby miło, aby liczyćn
na dół w tym samym czasie, zamiast, ale to nie ma wątpliwości, żek=0
ik=1
są fałszywie zwanego prime:Czek pierwszości jest trial-podział, skrócona sprawdzając zarówno
k
in-k
razem. Stwierdziłem, że jest to krótsze niż użycie generatora twierdzenia Wilsona (79 bajtów):Ideą tego jest utrzymanie listy wszystkich liczb pierwszych w dolnej połowie, aby były sprawdzane, zanim dotrzemy do górnej połowy, ale w punkcie środkowym
k=n/2
nie mieliśmy czasu, aby dodaćn-k
do listy out, kiedy dojdziemy dok
. Pomija to wersja iteracyjna, ale ma 82 bajty:źródło
MATL , 8 bajtów
Wypróbuj online!
Wyjaśnienie
Rozważ dane wejściowe
8
jako przykładInteresujące jest obserwowanie wykresu sekwencji przy użyciu nieco zmodyfikowanej wersji kodu:
Dla danych wejściowych
10000
wynikiem jestMożesz spróbować w MATL Online (Odśwież stronę, jeśli przycisk „Uruchom” nie zmieni się na „Zabij” po naciśnięciu). Wytworzenie wykresu na wejście zajmuje kilka około 25 sekund
3000
; przekroczą limit czasu nakładów powyżej kilku tysięcy.źródło
Upper triangular part
sztuczka jest naprawdę fajna!JavaScript (ES6),
777370 bajtówZaoszczędź 3 bajty dzięki @Arnauld
f
jest funkcją testu pierwszeństwa; odpowiednią funkcją jestg
.f
działa poprzez rekurencyjne odliczanie od n-1 ; przepływ kontrolny na każdym etapie wygląda następująco:x<2||
Jeśli x <2 , liczba jest liczbą pierwszą; zwrot 1 .n%x&&
W przeciwnym razie, jeśli n mod x = 0 , liczba nie jest liczbą pierwszą; powrócićn%x
.f(n,x-1)
W przeciwnym razie liczba może być liczbą pierwszą; zmniejsz x i spróbuj ponownie.g
działa w podobny sposób, choć z niewielkim przepływem kontroli. Działa poprzez pomnożenie f (b) przez f (ab) dla każdej liczby całkowitej b w zakresie [2, piętro (a / 2)] , a następnie zsumowanie wyników. To daje nam liczbę par, które sumują się do miejsca, w którym obie liczby w parze są liczbą pierwszą, co jest dokładnie tym, czego chcemy.źródło
a
jest pozytywny,b=a>>1
powinien oszczędzić bajt.>>
operatora ...f=(n,x=n)=>--x<2||n%x&&f(n,x)
?05AB1E ,
108 bajtówNiezwykle nieefektywny.
Wypróbuj online! lub Wypróbuj mniej wydajny sposób generowania liczb pierwszych
Wyjaśnienie
n = 10
użyty jako przykład.źródło
ü
zamiast tego użyć ? JakD!fü+r¢
?n=10
który byłby policzony (10, [5,8,12]), który wynosi 0 zamiast 2.ü
stosuje się tylko między każdą parą elementów. Wpadło mi to na pomysłã
, ale niestety okazało się, że 1 bajt dłużej.GAP , 57 bajtów
Nie sądzę, że GAP ma krótszą drogę niż ta oczywista.
Number
zlicza, ile elementów listy spełnia predykat.Używając go do obliczenia pierwszych 100 wartości:
źródło
Brachylog , 22 bajty
Wypróbuj online!
Wyjaśnienie
Prosta transkrypcja problemu.
źródło
Mathematica, 52 bajty
Wynik jest dostarczany jako funkcja anonimowa. Spróbuj narysować na nim wykres:
Nawiasem mówiąc, kod ma tę samą długość z wersją funkcji kodu demonstracyjnego w OEIS.
źródło
PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
Galaretka , 12 bajtów
TryItOnline
1-100
W jaki sposób?
źródło
Rakieta 219 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
Właściwie 11 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
05AB1E , 6 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Haskell, 73 bajty
Przykład użycia:
map f [1..25]
->[0,0,0,1,1,1,1,1,1,2,0,1,1,2,1,2,0,2,1,2,1,3,0,3,1]
.Bezpośrednie wdrożenie definicji: najpierw wiążą
r
wszystkich liczb pierwszych w górę do liczby wejściowejn
, a następnie wziąć1
na zawszep
iq
odr
gdzieq<=p
ap+q==n
i zsumować je.źródło