Je Propose, aujourd’hui, une solution permettant de tester la conjecture de Goldbach des j premier pair sur r.
Dans un courrier adressé à Leonhard Euler, son contemporain Christian Goldbach lui propose la conjecture suivante :
#Tout entiers pair s'écrit comme la somme de deux nombres premiers
La version moderne admet une légère modification :
#Tout entiers pair superieur à 2 s'écrit comme la somme de deux nombres premiers
2 ne respecte pas la conjecture, en effet 2 ne peut s’ecrire que comme la somme de 1 par 1, 1, autrefois considéré comme premier, ne l’est pas mais est un nombre second, 2 ne peut donc pas s’écrire comme la somme de deux nombres premier.
J’affecte à j la quantité de nombre que je veux tester dans le cadre de la conjecture de goldbach, ici je choisis de tester sur les 100 premier pair, il suffira ensuite de changer la valeur de j afin de tester les j premier pair:
j <- 100
Je crée une séquence de nombre allant de 3 à j, je choisis d’exclure 2.
Puis je crée un masque à l’aide du modulo 2. En clair, je décide de conserver les nombres qui, divisé par deux, ont un reste égal à 0, soit des nombres pairs.
nombre <- seq(3,j)
nombre_pair <- nombre[nombre%%2==0]
nombre_pair
## [1] 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
## [20] 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78
## [39] 80 82 84 86 88 90 92 94 96 98 100
Je crée une séquence de nombre premier, je génère ainsi les nombres premiers compris entre 0 et j.
Je n’ai pas créé cette fonction, cette dernière est disponible sur le site suivant : https://www.w3resource.com/r-programming-exercises/basic/r-programming-basic-exercise-6.php
prime_numbers <- function(n) {
if (n >= 2) {
x = seq(2, n)
prime_nums = c()
for (i in seq(2, n)) {
if (any(x == i)) {
prime_nums = c(prime_nums, i)
x = c(x[(x %% i) != 0], i)
}
}
return(prime_nums)
}
else
{
stop("Input number should be at least 2.")
}
}
nombre_premier <- prime_numbers(j)
nombre_premier
## [1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
La fonction expand.grid me permet de créer toutes les combinaisons possibles entre les deux listes proposées en argument sous la forme de deux colonnes.
Puis, je somme mes deux colonnes. J’obtiens alors la somme de tous les nombres premiers compris entre 1 et j.
l <- expand.grid(nombre_premier, nombre_premier)
ll <- l[1]+l[2]
length(t(ll))
## [1] 625
head(ll)
## Var1
## 1 4
## 2 5
## 3 7
## 4 9
## 5 13
## 6 15
Certains nombres pairs pouvant s’écrire comme étant la somme de plusieurs combinaisons de nombre premier :
#10 par exemple peut s'écrire comme :
#3+7=10
#5+5=10
j’utilise la fonction unique() afin de ne garder qu’une des occurrences.
somme_premier <- unique(ll)
length(t(somme_premier))
## [1] 114
head(somme_premier)
## Var1
## 1 4
## 2 5
## 3 7
## 4 9
## 5 13
## 6 15
Ne voulant que la somme des premier pairs, je réutilise le modulo 2
somme_premier_pair <- somme_premier[somme_premier%%2==0]
somme_premier_pair
## [1] 4 6 8 10 14 16 20 22 26 32 34 40 44 46 50 56 62 64 70
## [20] 74 76 82 86 92 100 12 18 24 28 36 42 48 52 58 66 72 78 84
## [39] 88 94 102 30 38 54 60 68 80 90 96 104 108 110 106 114 98 116 112
## [58] 120 118 126 128 134 124 130 138 122 132 140 136 144 142 150 148 156 158 146
## [77] 164 154 160 168 152 162 170 176 166 172 180 178 186 194
Je réalise un test logique afin de savoir si les nombres compris dans la variable nombre_pair son compris dans somme_premier_pair
test <- nombre_pair %in% somme_premier_pair
test
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [46] TRUE TRUE TRUE TRUE
Je fais le choix d’inverser mes valeurs logiques afin que le masque ne me renvoie que les nombres pairs qui ne respecteraient pas la conjecture.
masque <- !test
masque
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE
Je teste donc la conjecture.
nombre_pair[masque]
## integer(0)
Pour les 100 premiers pair superieur à 2, tous respectent la conjecture de Goldbach. il nous appartient de tester la conjecture pour les 200, 500, 1000, etc. premier pair en changeant la valeur comprise dans l’objet j.