La conjecture de Goldbach déclare que tout nombre pair supérieur à deux peut être exprimé comme la somme de deux nombres premiers. Par exemple,
4 = 2 + 2
6 = 3 + 3
8 = 5 + 3
Cependant, une fois à 10, quelque chose d'intéressant se produit. Non seulement 10 peut être écrit comme
5 + 5
mais il peut aussi s'écrire
7 + 3
Puisque 10 peut être exprimé comme la somme de deux nombres premiers de deux manières , nous disons que la "partition de Goldbach" de 10 est 2
. Ou plus généralement,
La partition de Goldbach d'un nombre est le nombre total de façons distinctes d'écrire
n = p + q
oùp
etq
sont des nombres premiers etp >= q
Votre défi consiste à écrire un programme ou une fonction qui trouve la partition Goldbach d'un nombre. Or, techniquement, le terme "partition de Goldbach" n'est utilisé que pour désigner les nombres pairs. Cependant, comme l'entier impair p + 2 peut également être exprimé comme la somme de deux nombres premiers si p> 2 est premier, nous allons l'étendre à tous les entiers positifs ( A061358 ).
Vous pouvez supposer en toute sécurité que votre entrée sera toujours un entier positif, et vous pouvez prendre l'entrée et la sortie dans l'une de nos méthodes autorisées par défaut , par exemple les arguments de fonction et la valeur de retour, STDIN et STDOUT, la lecture et l'écriture dans un fichier, etc.
Les partitions de Goldbach des entiers positifs jusqu'à 100 sont:
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
Comme d'habitude, les failles standard s'appliquent et la réponse la plus courte en octets gagne!
Réponses:
Gelée , 8 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
Python 2, 76 octets
Se déplace récursivement de
k=2
àn/2
, en additionnant les valeurs où les deuxk
etn-k
sont premiers. Ce serait bien de comptern
en même temps, mais cela a un problèmek=0
etk=1
est faussement appelé prime:Le contrôle de primalité est de première instance, raccourci en vérifiant les deux
k
etn-k
ensemble. J'ai trouvé que c'était plus court que d'utiliser un générateur de théorème de Wilson (79 octets):L'idée pour celui-ci est de garder une liste de tous les nombres premiers dans la moitié inférieure pour être vérifiée au moment où nous arrivons à la moitié supérieure, mais pour le milieu
k=n/2
, nous n'avons pas eu le temps d'ajoutern-k
à la liste lorsque nous arrivons àk
. Une version itérative contourne cela, mais fait 82 octets:la source
MATL , 8 octets
Essayez-le en ligne!
Explication
Considérez la saisie
8
comme exempleIl est intéressant d'observer le graphique de la séquence , en utilisant une version légèrement modifiée du code:
Pour l'entrée,
10000
le résultat estVous pouvez l'essayer sur MATL Online (Actualisez la page si le bouton "Exécuter" ne change pas en "Tuer" lorsqu'il est pressé). Il faut plusieurs 25 secondes environ pour produire le graphique en entrée
3000
; les entrées supérieures à quelques milliers expireront.la source
Upper triangular part
truc est vraiment cool!JavaScript (ES6),
777370 octetsEnregistré 3 octets grâce à @Arnauld
f
est une fonction de test de primalité; la fonction pertinente estg
.f
fonctionne en décomptant récursivement à partir de n-1 ; le flux de contrôle à chaque étape se déroule comme suit:x<2||
Si x <2 , le nombre est premier; retour 1 .n%x&&
Sinon, si n mod x = 0 , le nombre n'est pas premier; retourn%x
.f(n,x-1)
Sinon, le nombre peut ou non être premier; décrémenter x et réessayer.g
fonctionne de façon similaire, mais avec moins de flux de contrôle. Il fonctionne en multipliant f (b) par f (ab) pour chaque entier b dans la plage [2, étage (a / 2)] , puis en additionnant les résultats. Cela nous donne le nombre de paires qui totalisent un où les deux nombres de la paire sont premiers, ce qui est exactement ce que nous voulons.la source
a
est positif,b=a>>1
devrait vous faire économiser un octet.>>
opérateur ...f=(n,x=n)=>--x<2||n%x&&f(n,x)
?05AB1E ,
108 octetsExtrêmement inefficace.
Essayez-le en ligne! ou Essayez un moyen moins efficace de générer des nombres premiers
Explication
n = 10
utilisé comme exemple.la source
ü
place? CommeD!fü+r¢
?n=10
qui serait count (10, [5,8,12]) qui est 0 au lieu de 2.ü
est appliqué uniquement entre chaque paire d'éléments. Cela m'a donné l'idée d'essayerã
, mais cela s'est avéré malheureusement 1 octet de plus.GAP , 57 octets
Je ne pense pas que GAP ait un chemin plus court que celui évident.
Number
compte le nombre d'éléments d'une liste qui satisfont un prédicat.L'utiliser pour calculer les 100 premières valeurs:
la source
Brachylog , 22 octets
Essayez-le en ligne!
Explication
Une transcription directe du problème.
la source
Mathematica, 52 octets
Le résultat est fourni comme une fonction anonyme. Essayez de tracer un graphique dessus:
Par ailleurs, le code a la même longueur avec la version de fonction du code de démonstration sur OEIS.
la source
PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
Gelée , 12 octets
TryItOnline
1-100
Comment?
la source
Raquette 219 octets
Non golfé:
Essai:
Production:
la source
En fait , 11 octets
Essayez-le en ligne!
Explication:
la source
05AB1E , 6 octets
Essayez-le en ligne!
Explication:
la source
Haskell, 73 octets
Exemple d'utilisation:
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]
.Implémentation directe de la définition: liez
r
d'abord tous les nombres premiers jusqu'au nombre d'entréen
, puis prenez un1
pour tousp
etq
d'r
oùq<=p
etp+q==n
et additionnez-les.la source