Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 23-11-2020 21:25:26
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Nouvelle logique pour calculer les nombres premiers
Bonjour Mes amis
J'en viens vers vous cette fois après avoir testé une nouvelle logique pour calculer les nombres premiers
je vous la présente comme ci dessous et je vous prie chacun selon le langage qu'il utilise de tester
Merci
// Langage utilisé : Windev
MonNombre,compteur,,carre,AncienCarre,Difference sont des entiers
xunite,xetendue sont des nombres reels
Result est booleen
/// Début de la boucle principale Nombre premiers entre 1 et 2000
Pour MonNombre =1 à 2000 pas 2 //(step 2)
carre=(MonNombre*MonNombre)/2
Difference=Carre-AncienCarre
Result=Faux
Si modulo(Difference,12)=0
Result=Vrai
fin
Si Result=vrai et PartieDécimale(Racine(MonNombre))<>0
XEtendue=PartieEntière(Racine(MonNombre))
//Balayage des diviseurs potentiels de MonNombre
Pour Compteur=3 a Xetendue Pas 2
Xunite=MonNombre/Compteur
Si PartieDécimale(Xunite)=0
Result=Faux // Pas premier
Fin
Fin
Si Result=vrai
Afficher MonNombre //Nombre premier afficher selon votre langage dans un tableau ou Liste
AncienCarre=Carre
fin
Fin
Fin
Voilà c'est tout
Dernière modification par Omhaf (24-11-2020 14:29:22)
Hors ligne
#3 25-11-2020 09:58:40
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Re,
Je ne t'ai pas oublié, mais 4 fois par an mars, juin, septembre, décembre, je rédige la revue trimestrielle de 20 pages de mon association...
Et à chaque fois, ça me prend un bon mois, parce que j'ai 10 pages d'articles d'intérêt général à écrire .
Et il faut que je trouve les sujets et que j'écrive, résume, mixe ce qui est rapporté dans divers magazines et ça me prend du temps (jusqu'au 15 du mois)...
Ensuite il faut que je fasse un routage : là j'en ai pour 4/5 jours de vérification d'adresses (il y en a 150 en tout)...
Je prends un peu de temps ce matin...
Alors, retranscrit en Python ton programme donne des résultats qui seraient justes (surprenant !) si ce n'était la présence des multiples de 5 égaux à 30k+5 avec k entier naturel partant de k=0...
L'as-tu testé toi ?
Soit, c'est non, soit tu as oublié une initialisation.
Quand on arrive là, gros souci :
Anciencarre a bien été défini mais pas initialisé.
Ce qui fait que le calcul de Difference est impossible : en effet à l'entrée dans la première boucle, la première fois, la valeur de Anciencarre est inconnue. J'ai supposé que c'était 0.
Je ne connais pas Windev, mais pour lui visiblement carre et Carre, c'est la même variable, pas pour Python.
La fonction partie décimale n'existe pas en Python , j'ai donc fabriqué une fonction anonyme qui fait le boulot...
En Python, pas de Fin, c'est l'alignement vertical qui détermine cette fin.
from math import sqrt
PartieDecimale=lambda x : x-int(x)
AncienCarre=0
Primes=[]
for MonNombre in range(1,100,2):
Carre=MonNombre**2//2 # Quotient entier, ce que toi tu ne précises pas
Difference=Carre-AncienCarre
Result=False
if Difference %12 ==0:
Result=True
if Result==True and PartieDecimale(sqrt(MonNombre))!=0:
Xetendue=int(sqrt(MonNombre))
for compteur in range(3,Xetendue,2):
Xunite=MonNombre/compteur # quotient décimal
if PartieDecimale(Xunite)==0:
result=False
if Result==True:
Primes.append(MonNombre)
AncienCarre=Carre
print(Primes)
Voici la liste de 1 à 100 :
[5, 7, 11, 13, 17, 19, 23, 29, 31, 35, 37, 41, 43, 47, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97]
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#4 25-11-2020 10:42:17
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Re
Merci Yoshi et bon courage pour ton travail
Je vais reprendre le travail et voir pourquoi dans ton algorithme on obtient des multiples de 5, c'est bizarre chez moi ils n'apparaissent pas du tout.
@ très bientôt
Hors ligne
#5 25-11-2020 10:50:02
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Re,
from math import sqrt
PartieDecimale=lambda x : x-int(x)
AncienCarre=0
Primes=[]
for MonNombre in range(1,100,2):
Carre=MonNombre**2//2 # Quotient entier, ce que toi tu ne précises pas
Difference=Carre-AncienCarre
Result=False
if Difference %12 ==0:
Result=True
if Result==True and PartieDecimale(sqrt(MonNombre))!=0:
Xetendue=int(sqrt(MonNombre))
for compteur in range(3,Xetendue,2):
Xunite=MonNombre/compteur # quotient décimal
if PartieDecimale(Xunite)==0:
Result=False # Correctif : il fallait écrire Result (R majuscule)
if Result==True:
Primes.append(MonNombre)
AncienCarre=Carre
print(Primes)
Arx Tarpeia Capitoli proxima...
Hors ligne
#6 25-11-2020 10:50:13
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Re,
C'est bon, j'ai trouvé (et corrigé).
Et pour avoir 2 et 3, je les inscris dans ma liste au départ, au lieu de partir d'une liste vide.
from math import sqrt
PartieDecimale=lambda x : x-int(x)
AncienCarre=0
Primes=[2,3]
for MonNombre in range(1,2000,2):
Carre=MonNombre**2//2 # Quotient entier, ce que toi tu ne précises pas
Difference=Carre-AncienCarre
Result=False
if Difference %12 ==0:
Result=True
if Result==True and PartieDecimale(sqrt(MonNombre))!=0:
Xetendue=int(sqrt(MonNombre))
for compteur in range(3,Xetendue,2):
Xunite=MonNombre/compteur # quotient décimal
if PartieDecimale(Xunite)==0:
Result=False # Correctif : il fallait écrire Result (R majuscule)
if Result==True:
Primes.append(MonNombre)
AncienCarre=Carre
print(Primes)
Sortie :
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 35, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 143, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 323, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 899, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1763, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999]
Je ferai tout à l'heure des essais avec une borne sup à 2 000 000 et je vérifierai s'il n'y a pas d'erreur...
@+
[EDIT]Pas la peine, dans la liste ci-dessus, il y a un intrus 35 !
idem pour la liste à 100, 200, 300, 1000....
Dernière modification par yoshi (25-11-2020 11:02:15)
Arx Tarpeia Capitoli proxima...
Hors ligne
#9 25-11-2020 12:15:22
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Bonjour Omhaf,
Si tu ne lis pas mes réponses, à quoi sert que je prenne le temps d'écrire ?
J'avais corrigé avant que tu n'aies le temps de dire ouf !
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#10 25-11-2020 12:18:41
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Désole Modo Ferox j'étais plongé dans les calculs , désolé pour mon indélicatesse j'ai posté avant de consulter les nouveaux postes
Dernière modification par Omhaf (25-11-2020 12:19:50)
Hors ligne
#11 25-11-2020 12:49:00
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Pour le 35, normalement il doit passer dans la boucle avec 35/3 est il entier? Non donc Result =False le 35 ne devrait pas passer
Je ne connais pas Python mais vérifier que la boucle part de 3 avec 3 inclu
Hors ligne
#12 25-11-2020 13:05:59
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Salut,
carre=(MonNombre*MonNombre)/2 c'est bien le calcul du quotient entier ?
Xunite=MonNombre/Compteur : c'est le calcul du quotient décimal ?
Pour le 35, normalement il doit passer dans la boucle avec 35/3
Laquelle, il y en a 2 ?
équivalent de compteur va de 3 (inclus) à Xtendue (exclu).
J'ai imprimé les 2 codes l'un à côté de l'autre.
Je vais voir si je trouve quelque chose, sinon, j'afficherai les résultats intermédiaires.
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#13 25-11-2020 13:30:27
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
oui quotient entier c'est vrai je ne l'ai pas déclaré car en Windev dès lors que vous définissez une variable comme entier le travail est fait alors qu'en python c'est différent, il paraît
oui dans la boucle interne for compteur in range(3,Xetendue,2):
Dernière modification par Omhaf (25-11-2020 13:33:24)
Hors ligne
#15 25-11-2020 15:49:52
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Bonjour 48PierrelePetit
Malheureusement je travaille sur un PC vieille génération 32 bits et je ne crois pas que les réels sous Windev supporteraient un si grand nombre mais déjà arriver à un million cela réconforte.
J'attends de vous une confirmation que ça marche plus loin
Mais permettez-moi de poser une question: Est ce que ce travail apporte quelque chose de nouveau ou non
Merci.
Hors ligne
#16 25-11-2020 16:33:07
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
salut,
Je ne vois pas d'erreur de traduction...
Peux-tu me confirmer que le script que tu as donné est rigoureusement conforme à ce que tu testes avec Windev ?
Ensuite si tu pouvais expliquer sur quoi repose ton algorithme ! :
1. Il serait peut-être possible de l'écrire autrement
2. En conséquence de l'optimiser parce que là, en l'état, il est très lent...
Quand même, ce 35 est curieux, c'est le seul multiple de 5 de toutes mes listes...
Qu'est-ce que ce 35 peut bien avoir de spécial, et pas tous les autres multiples, pour que lui, il passe à travers les mailles du filet ?
Je viens de mettre le doigt sur autre chose et là ça ne me choque pas !
Pour 1000 : 4 nombres de trop
Pour 100000 : 19 nombres de trop...
Ce n'est donc pas lié à 35.
Il y a une traduction ou une réaction de Python différente de celle de Windev à un test, d'où la nécessité de connaître le pourquoi de ton algorithme...
Par exemple :
Pourquoi carre=(MonNombre*MonNombre)//2 ?
Pourquoi le calcul de Difference ?
Pourquoi tester Différence modulo 12 = 0 ?
....
@+
[EDIT]
C'est bon, j'ai trouvé, en faisant le boulot à la main...
Cette ligne :
for compteur in range(3,Xetendue,2):
doit être corrigée ainsi
for compteur in range(3,Xetendue+1,2):
J'ai trouvé en testant 35.
La partie entière de sa racine est 5.
On part de 3 et on va donc de 3 à 5, 5 exclu... alors que la correction permet de passer à 6 exclu donc de tester le 5... et d'éliminer 35 et tous ses petits copains qui pour la même raison se trouvaient exclus du test...
Dernière modification par yoshi (25-11-2020 16:47:01)
Arx Tarpeia Capitoli proxima...
Hors ligne
#17 25-11-2020 16:46:44
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Salut yoshi
Je crois que le problème entre Windev et python c'est l'expression des variables et de leurs initialisations
Essaie de réinitialiser tes variables aprés chaque passage de boucle (mis à part MonNombre)
Vérifier que Carre et AncienCarre portent les valeurs qu'on leur affecte (surtout AncienCarre)
Sinon
je suis prêt à te passer mon algorithme Windev et tu pourras le faire tester par quelqu'un d'autres sous sa machine avec Windev
Dernière remarque
Il est évident que 35/3 n'est pas entier et que 35 ne doit pas passer dans la dernière boucle sans que Result soit faux
Je crois que cette remarque devrais suffire pour dire que le problème ne vient pas de mon algorithme
Dernière modification par Omhaf (25-11-2020 16:49:29)
Hors ligne
#18 25-11-2020 16:48:57
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Re,
j'ai ajouté un codicille à mon post #17 : je venais de trouver la cause du dysfonctionnement apprarent de la version Python...
Rien à voir avec ton diagnostic.
Pour ce que j'en comprends, ton algo semble effectivement original.
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#21 25-11-2020 17:49:40
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Re,
M'as-tu lu ?
J'AI TROUVE LA CAUSE DU PROBLEME !
Citation complète (et non tronquée) de l'EDIT du post #17:
On part de 3 et on va donc de 3 à 5, 5 exclu... alors que la correction permet de passer à 6 exclu donc de tester le 5... et d'éliminer 35 et tous ses petits copains qui pour la même raison se trouvaient exclus du test...
Ne réinvente pas la roue, s'il te plaût..
Explication de texte:
Lorsque Windev (et d'autres) fait une boucle de 3 à 5, il passe en revue 3, 4, 5 et 6 mais comme 6>5 il est programmé pour que ce soit un test d'arrêt implicite (La dernière version date de décembre 2019 - source Wikipedia)
A la sortie de la boucle pour i de 1 à 5, si tu testes la valeur de i, tu auras 6.
En Python, la borne supérieure sert de de test d'arrêt explicite : il n'est pas caché...
Donc avec une borne d'arrêt à 6, il teste 5, continue arrive à 6 et s'arrête avant d'affecter 6 à la valeur du compteur.
C'est une particularité comme celle de commencer les boucles à 0, ou comme listes (tableaux), chaînes de caractères commençant à l'indice 0...
Donc, dans des cas bien particuliers, si je veux absolument tester la borne sup, je dois choisir borne sup+1 : c'est cette particularité qui cause parfois des soucis inapparents : je me suis méfié pour la première boucle ce qui ne changeait rien et je me suis fait piéger par la 2e...
Tu veux rire un peu ?
Python te permet d'écrire "Palindrome" (par ex) l'envers en une seule instruction :
print ("Palindrome"[::-1] ) ---> emordnilaP
Chacun ses particularités...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#22 25-11-2020 17:50:25
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 948
Re : Nouvelle logique pour calculer les nombres premiers
Re,
M'as-tu lu ?
J'AI TROUVE LA CAUSE DU PROBLEME !
Citation complète (et non tronquée) de l'EDIT du post #17:
On part de 3 et on va donc de 3 à 5, 5 exclu... alors que la correction permet de passer à 6 exclu donc de tester le 5... et d'éliminer 35 et tous ses petits copains qui pour la même raison se trouvaient exclus du test...
Ne réinvente pas la roue, s'il te plaût..
Explication de texte:
Lorsque Windev (et d'autres) fait une boucle de 3 à 5, il passe en revue 3, 4, 5 et 6 mais comme 6>5 il est programmé pour que ce soit un test d'arrêt implicite (La dernière version date de décembre 2019 - source Wikipedia)
A la sortie de la boucle pour i de 1 à 5, si tu testes la valeur de i, tu auras 6.
En Python, la borne supérieure sert de de test d'arrêt explicite : il n'est pas caché...
Donc avec une borne d'arrêt à 6, il teste 5, continue arrive à 6 et s'arrête avant d'affecter 6 à la valeur du compteur.
C'est une particularité comme celle de commencer les boucles à 0, ou comme listes (tableaux), chaînes de caractères commençant à l'indice 0...
Donc, dans des cas bien particuliers, si je veux absolument tester la borne sup, je dois choisir borne sup+1 : c'est cette particularité qui cause parfois des soucis inapparents : je me suis méfié pour la première boucle ce qui ne changeait rien et je me suis fait piéger par la 2e...
Tu veux rire un peu ?
Python te permet d'écrire "Palindrome" (par ex) l'envers en une seule instruction :
print ("Palindrome"[::-1] ) ---> emordnilaP
Chacun ses particularités...
Oui, c'est un travail qui sort de l'ordinaire jusqu'à preuve du contraire, maintenant, il faudrait raffiner en l'optimisant, d'où mes questions...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#23 25-11-2020 19:56:42
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Bonsoir 48PierrelePetit
Disons que c'est une conjecture pour l'instant et appelons la Conjecture Omar
ça te va ? hhhhhh
Non, sérieusement l'apport neuf à mon avis est comme suit
1 er Ecarter les nombres dont la racine est un entier
2 eme soit N le nombre en cours et N' le nombre premier qui précède
si (N-N")/12 est un entier on continue
Dernière modification par Omhaf (25-11-2020 20:11:25)
Hors ligne
#24 25-11-2020 21:38:28
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Bonjour 48PierrelePetit
écarter 81 ou 169 par exemple dans la boucle principale qui sont des carrés de 9 et 13 te pose un problème dans la tête ?
je crois que tu t'es précipité dans tes propos ou bien tu as raison je dois m'arrêter et je dois te remercier du conseil
Pourquoi faut il toujours que je reçoive des coups dans ce forum ? ne sommes nous pas entre intellectuels qui pourraient excuser et corriger poliment les erreurs des autres ?
Dernière modification par Omhaf (25-11-2020 21:51:18)
Hors ligne
#25 25-11-2020 21:59:14
- Omhaf
- Membre
- Inscription : 16-01-2020
- Messages : 225
Re : Nouvelle logique pour calculer les nombres premiers
Re
Le compteur traitera 13 avec son carré 169 car racine(13) n'est pas entier et l'acceptera mais ce que tu n'as pas compris c'est lorsque le compteur arrivera a 169 Il ne calculera pas 169² car la racine de 169 est 13 qui est Entier
Dernière modification par Omhaf (25-11-2020 22:02:06)
Hors ligne