Trouver les nombres de Carmichaël

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7180
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

Trouver les nombres de Carmichaël

Message par gege » 13 avr. 2020 12:39

Bonjour,
Encore un truc un peu mathématique, bon une fois par semaine c'est permis si on ne s'éloigne pas trop du domicile...

Donc, pour trouver les nombres de Carmichaël (vous trouverez sur gougoule), il y a le critère de Korselt, qui dit :
N étant notre nombre,
Si P est un de ses diviseurs autre que 1 ou N,
Alors (P-1) divise (N-1).

Et je me disais : si on utilisait ce critère à l'envers pour trouver les nombres de Carmichaël constructivement ?
Note , N ne peux avoir un diviseur P en plus d'un exemplaire, exemple 4 = 2 x 2, 2 en double ==> pas Carmichaël.

A vos machines !
Enfin, je veux dire C.Ret, à ta machine :-)
G.E.

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 13 avr. 2020 14:10

Ah! Mince pas le temps de faire (encore) une petite sieste ?

Bon, j'ai pas (encore) bien compris la question.
Je vais commencer par analyser ce qu'est qu'un tel nombre car Mickaël n'est pas le seul qui ne le sais pas.
Sur la page Google il y a écrit :En théorie des nombres, un nombre de Carmichael, ou nombre absolument pseudo-premier, est un nombre composé n qui vérifie la propriété suivante :
  • pour tout entier a premier avec n, n est un diviseur de (aⁿ – a)
ou, ce qui est équivalent :
  • pour tout entier a premier avec n, n est un diviseur de ((aⁿ–1) – 1 )
A me voilà beau avec mon SHARP PC-1211 pour traiter (encore) une histoire de primalié.
Dans Wikipédia il y a écrit :Théorème (Korselt 1899)
Un entier positif composé n est un nombre de Carmichael si et seulement si :
  • aucun carré de nombre premier ne divise n. On dit alors que n est sans facteur carré.
  • et pour chaque diviseur premier p de n, le nombre p−1 divise n−1.
De plus, un tel nombre n divise tous les a*n–a quelque soit le nombre entier a y compris si celui-ci n'est pas premier à n.
Ah! ca c'est plus concret, l'horizon s'éclaircie à l'aube de calculs à mécaniser.

Bon, mais n'oublions pas la question:
gege a écrit :
13 avr. 2020 12:39
[…]N étant notre nombre, si P est un de ses diviseurs autre que 1 ou N, alors (P-1) divise (N-1).
Si on utilisait ce critère à l'envers pour trouver les nombres de Carmichaël constructivement ?[…]

Ah! Oui, j'aime bien être constructif. Cela me donne une idée...
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 13 avr. 2020 20:46

Bon, j'ai fait un petit code qui semble marcher. Tout au moins dans le sens vérifier qu'un nombre est bel et bien un nombre de Carmichael.

En fait, il cherche surtout à trouver une raison qui fait que le nombre sais n'est pas absolument pseudo-premier.

J'ai simplement modifier mon programme de décomposition d'un nombre en produit de ses facteurs premiers. Mon PC-1211 n'ayant pas en mémoire la liste des nombres premiers, j'utilise l'algorithme de décomposition afin d'égrainer les facteurs premiers diviseurs de n.
J'en profite pour vérifier que n n'a pas de facteur premier au carré. Ensuite, pour chaque diviseur f trouvé, je vérifie que (f-1) divise bien (n-1).
Si l'un des ces critères n'est pas respecté, j'arrête la décomposition car n n'est pas un nombre de Carmichaël.

Code : Tout sélectionner

1 "C" AREAD N:X=N,F=1
2 P=0,F=F+1+(F>2                                       // N = ... * F^P * X                           
3 Q=X/F: IF Q=INT Q LET X=Q , P=P+1 : GOTO 3+6*(P>1)   // SORT si multiplicité P du facteur F est >1          
4 IF  P  LET T=(N-1)/(F-1):IF T>INT T GOTO 9           // SORT Si facteur F ne vérifie pas (N-1)/(F-1)  
5 IF Q>F GOTO 2                                        // Scan les facteurs F jusqu'à F*F>X
6 IF X>1 LET T=(N-1)/(X-1):IF T>INT T GOTO 9           // X est le dernier facteur de N, T=1 si N est premier
8 IF X>1 IF T=1 PRINT N;"IS PRIME": END
7      PRINT N;"IS CARMICHAEL"    : END
9 PRINT N;"NO ABS P-PRIME"        : END
Cela ne permet pas (encore) une détermination constructive de la liste de nombres de Carmichaël, mais cela fonctionne bien pour vérifier si un nombre n est ou non premier ou nombre de Carmichaël.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 16 avr. 2020 10:55

J'avance lentement dans la recherche d'une détermination d'une méthode constructive de découverte des Nombre de Carmichaël.

En plus, cette première version pour tester si un nombre N est de Carmichael ne me convient pas. En effet, outre le fait qu'elle soit mal structurée, elle donne de mauvais résultat pour les petits nombres premiers qu'elle ne détecte pas.

Je propose donc cette nouvelle bouture qui correspond mieux à mes critères de qualité. Elle est mieux construite, plus rapide et fait économiser quelques pas de programme et le registre P.
Test Carmichael number SHARP PC-1211.gif
Test Carmichael number SHARP PC-1211.gif (31.11 Kio) Consulté 3401 fois
A ma grande surprise, cette version est aussi plus rapide, par exemple, le nombre de Carmichaël 314821 est vérifié en environ 33s.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 18 avr. 2020 09:45

Alors, où en êtes-vous de la construction structurée de nombres de Carmichael ?

Est-ce que 2588653081 est un nombre de Carmichael ? Mon précèdent code est-il correct ? Comment l'améliorer ?
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 438
Inscription : 27 janv. 2013 01:26
Localisation : Strasbourg
Contact :

Re: Trouver les nombres de Carmichaël

Message par dprtl » 18 avr. 2020 16:45

C.Ret a écrit :
18 avr. 2020 09:45
Est-ce que 2588653081 est un nombre de Carmichael ?
Je réponds rapidement à cette question, avec un algorithme naïf et quelques lignes de mon langage rétro préféré, le Basic 1000D sur Atari ST :
  • prfact() donne la décomposition en facteurs premiers
  • polymn(P) renvoie le nombre de monômes de P
  • polym(P, k) renvoie le k-ième monôme de P
Image

Donc 2588653081 est bien un nombre de Carmichael (copie d'écran après "Run"):

Image

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 19 avr. 2020 09:59

Merci Daniel, cela confirme bien les informations que j'ai obtenues par ailleurs.

Le code que tu présentes ressemble beaucoup à celui que j'ai introduis dans mon HP Prime/ mais je ne suis pas sûr de bien comprendre toutes les subtilités. En particulier, je ne comprends pas comment le test qui vérifie qu'il n'y a pas de facteur carré s'effectue. Mais ce test est-il nécessaire ?

Dans le code pour mon SHARP PC-1211 je l'ai codé afin de terminer au plus vite l'exécution de la boucle de détermination des facteurs qui peut prendre un peu de temps. J'ai donc procédé de la même façon dans le code pour la Prime. Sans me demander si ce test est nécessaire !?
HP Prime ISCARMI test code.gif
HP Prime ISCARMI test code.gif (6.86 Kio) Consulté 3326 fois
Sur la prime l'instruction ifactors(N) dispose les facteurs premiers du nombre N = f_1^p_1 * f_2^p_2 * ... * f_k^p_k dans un vecteur de la forme [f_1 p_1 f_2_ p_2 … f_k p_k ]. En centre de la boucle, je teste donc à chaque facteur k la divisibilité avec irem(n-1,FC(k)-1) qui renvoi le reste entier de la Division Euclidienne mais aussi la multiplicité du facteur lues directement par FC(k+1) dans le vecteur.

Le test length(FC)>2 permet d'éliminer d'entrée de jeu les nombres premiers détectés par le format du vecteur renvoyé par ifactors(P) = [ P 1 ] un peu comme on le fait sur TI-92.
HP Prime carmichael's 2588653081.png
HP Prime carmichael's 2588653081.png (12.9 Kio) Consulté 3326 fois
Effectivement 2588653081 est bien un nombre de Carmichaël. Il n'a pas de facteurs carrés et tous ses facteurs premiers décrémentés d'une unité sont diviseurs de 2588653080. Mon souci était que mon SHARP m'indiquait que ce n'était pas le cas au bout de quelques secondes seulement.
Test Carmichael number SHARP PC-1211.gif
Test Carmichael number SHARP PC-1211.gif (54.31 Kio) Consulté 3322 fois
Bon j'ai trouvé le bugge dans mon code pour SHARP PC-1211 : le test de divisibilité était défaillant pour les grands nombres.
La correction est assez simple, le soucis est d'ailleurs celui indiqué dans la page n°6 du manuel d'application de la CASIO fx-602p pour la décomposition en facteurs premiers de grands nombres; « ne pas utiliser un test basé sur la présence des décimales » qui disparaissent par manque de chiffres significatifs.

A la ligne 7:, le test fautif Q>INT Q a donc été remplacé par un test plus efficace non tributaire de l'arrondi dû à la précision X<>F*INT Q.

Et je suis content, en mode DEF la saisie 2588653081 [shift][ C ] affiche 2588653081.IS CARMICHAEL après tout de même 4'55" de laborieux calculs.

En fait j'en suis arrivé à générer des Nombres de Carmichael plus rapidement qu'à les vérifier! Pas mal pour un ordi'poche de 1981.
Pour le moment mon algorithme constructif n'est efficace que pour les nombres composés de trois facteurs premiers . . .
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 438
Inscription : 27 janv. 2013 01:26
Localisation : Strasbourg
Contact :

Re: Trouver les nombres de Carmichaël

Message par dprtl » 19 avr. 2020 16:54

C.Ret a écrit :
19 avr. 2020 09:59
Le code que tu présentes ressemble beaucoup à celui que j'ai introduis dans mon HP Prime/ mais je ne suis pas sûr de bien comprendre toutes les subtilités. En particulier, je ne comprends pas comment le test qui vérifie qu'il n'y a pas de facteur carré s'effectue. Mais ce test est-il nécessaire ?
Mon nouveau code corrigé et, peut-être, un peu mieux auto-documenté (?), vérifie aussi qu'il n'y a pas de facteur carré :

Code : Tout sélectionner

clear timer
n=2588653000
if (n mod 2)=0
  n=n+1
endif
while n<999999999999
  decomposition=prfact(n)
  carmichael=true
  nb_facteurs=polymn(decomposition)
  if nb_facteurs>2
    for i=1,nb_facteurs
      facteur=polym(decomposition,i)
      if deg(facteur)>1 or ((n-1) mod (norm(facteur)-1)>0)
        carmichael=false
        exit
      endif
    next i
    if carmichael=true
      print n;" =";prfact$(n);"  ";timer;"s"
      clear timer
    endif
  endif
  n=n+2
wend
En ne commençant pas très loin de 2588653081, le programme confirme rapidement le résultat précédent. Par contre, pour trouver le nombre de Carmichael suivant, c'est long... long... La méthode dite "constructive" est attrayante.

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 19 avr. 2020 22:01

dprtl a écrit :
19 avr. 2020 16:54
[…] Par contre, pour trouver le nombre de Carmichael suivant, c'est long... long... La méthode dite "constructive" est attrayante.
Tout dépend de ce que l'on entend par le nombre suivant, ce peut être 2'597'928'961 ou plus simplement 190'180'654'489.

Ton code est bien. Mais ce n'est pas la meilleure méthode pour rechercher de façon structurée.
Avancer selon n de façon additive est bien trop long.

L'idée accélératrice est d'avancer de façon multiplicative.

Pour bien expliquer, je vais prendre un exemple simplissime, ce qui permettra d'obtenir des résultats en un temps raisonnable:

je cherche, dans un premier temps, uniquement les Nombres de Carmichael inférieur à M=3000 et qui se décomposent en exactement trois facteurs premiers.

M petit pour aller assez vite et avoir assez de candidats pour vérifier que ma méthode fonctionne(bien ?).
Pourquoi trois facteurs. car il n'est pas possible d'avoir des Nombres de Carmichaël avec moins de facteur.
Ensuite, il n'y a pas de Nombre de carmichaël pairs, le premier facteur est donc au minium 3.

L'idée serait donc un code du type :

Code : Tout sélectionner

a←3
do 
: if a is prime
: : do 
: : : b←a+2
: : : if b is prime
: : : : c←b+2
: : : : do 
: : : : : if c is prime
: : : : : : n←a*b*c
: : : : : : if (a-1 DIV n-1) AND  (b-1 DIV n-1)  AND  (c-1 DIV n-1)   then print n 
: : : : : c←c+2
: : : : loop until a*b*c>M
: : : b←b+2
: : loop until a*b*(b+2)>M
: a←a+2
loop a*(a+2)*(a+4)>M
Premier jet par force brute, qu'il est possible d'optimiser en tenant compte des propriétés des Nombre de Carmichael et de leurs facteurs
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7180
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

Re: Trouver les nombres de Carmichaël

Message par gege » 21 avr. 2020 22:25

Bonjour,
Pour construire les nombres de Carmichael je m'étais dit qu'on pouvait partir de la propriété suffisante citée ci-dessus et ainsi les trouver directement sans avoir à décomposer tous les nombres candidats de 1 à N en leurs facteurs permiers.
C'est la méthode "constructive".
En faisant la grosse hypothèse que ces nombres ont tous trois diviseurs, on peut taper ceci :

Code : Tout sélectionner

EXPORT carmichael(n)
BEGIN
LOCAL a,b,c,d,e,f,g,p;
{2}▶p;FOR a FROM 2 TO n DO
nextprime(p[a-1])▶p[a];END;
FOR a FROM 1 TO n-2 DO p[a]▶d;
FOR b FROM a+1 TO n-1 DO p[b]▶e;
FOR c FROM b+1 TO n DO p[c]▶f;d*e*f-1▶g;
IF 0≠irem(d*e*f-1,d-1) THEN CONTINUE;END;
IF 0≠irem(d*e*f-1,e-1) THEN CONTINUE;END;
IF 0≠irem(d*e*f-1,f-1) THEN CONTINUE;END;
PRINT(g+1);
END;END;END;END;
Le paramètre n est le nombre de nombres premiers parmi lesquels on va rechercher.
Par exemple, si n=6, on cherche les trois facteurs parmi 2, 3, 5, 7, 11 et 13.
Avec n=30, on trouve déjà 14 nombres de Carmichaël.
Malheureusement, le nombre de tests augmente comme n^3/6, donc même la HP Prime finit par fatiguer...

397 étant le 78ème nombre premier, on trouve bien le nombre de Carmichaël 314821 parmi les 28 nombres trouvés pour n=78 en 142 secondes.

Sur d'autres machines, il faudra programmer la génération de la liste des n premiers nombres premiers à la main, la Prime disposant pour sa part de la pratique fonction nextprime() (non ce n'est pas un prochain modèle de chez HP...).
Je vais voir pour optimiser, et tester avec plus de 3 diviseurs...
A+
G.E.

EDIT : suite à l'intéressante remarque de C.ret ci-dessus, il faudrait remplacer 2 par 3 en quatrième ligne dans {2}▶p !
EDIT 2 : Flûte c'est la même idée que C.ret ! Mais j'vous jure je n'ai pas copié ! Bon pour me faire pardonner je fonce sur la "Question/Concours d'un Dimanche Après-midi"

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 25 avr. 2020 09:16

Supposons que je cherche l'ensemble des nombres premiers c >109 tel que les nombres N= 37 × 109 × c soient de Carmichael.

Cela revient à chercher les nombres premier c > 109 tels que (c-1) divise (N-1).

Or, il s'avère que pour tout nombre n pouvant s'écriren = p × up est premier et u quelconque, nous pouvons démontrer que (p-1) divise (n-1) si et seulement si (p-1) divise (u-1) également.

(La démonstration n'est pas compliquée, bien au contraire et j'invite chacun à s'y essayer. j'y suis finalement arrivé moi aussi avant-hier).

Le corollaire de ce lemme est que notre recherche revient donc à trouver les nombres premiers c > 109 tels que (c-1) divise (37×109 - 1)=4032.

Les diviseurs d>107 de 4032 sont : 112 126 144 168 192 224 252 288 336 448 504 576 672 1008 1344 2016.

Nombres premiers dans l'intervalle ] 109 ; 2017 ] sont :
109 113 127 131 137 139 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 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 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 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 2003 2011 2017

Les nombres premiers dans l'intervalle ]109 ; 2017 ] sont donc beaucoup, beaucoup, beaucoup plus nombreux que les diviseurs d de 4032.
Donc mon algorithme donné précédemment qui consiste à chercher c premier puis à vérifier ensuite si c convient perd beaucoup beaucoup beaucoup de temps.

Il est bien plus efficace de chercher parmi les diviseurs d ceux qui correspondent à un nombre (d+1) premier; ce qui donnera directement une liste de candidats pour c : 113 127 167 193 337 449 577 673 1009 2017.

Mais tous ces candidats ne conviennent pas , ne convient uniquement c = 2017 qui permet d'obtenir un nombre N = 37 x 109 x 2017 de Carmichael.

Les autres candidats pour c conduisent à des nombres (n-1) qui ne sont pas multiples de a-1=36 ou de b-1=108.

Candidats pour c : 113 127 167 193 337 449 577 673 1009 2017
Valeurs de (109 × c -1) : 12317 13843 18203 21037 36733 48941 62893 73357 109981 219852 seul 219852 est multiple de 36.
Valeurs de (37 × c - 1 ) : 4181 4699 6179 7141 12469 16613 21349 24901 37333 74628 seul 74628 est multiple de 108.

On se rend donc compte que les nombres c que l'on cherche doivent vérifier trois contraintes (en plus d'être premiers) :
c doit être un nombre premier tel que
  • ( a - 1 ) divise ( b × c -1)
  • ( b - 1 ) divise ( a × c -1 )
  • ( c - 1 ) divise ( a × b -1 )
Conclusion:
L'algorithme que je proposais dans mon post précèdent est loin d'être optimal, car pour deux facteurs premiers donnés a et b, il recherche maladroitement et systématiquement tous les nombres premiers c qui produisent un nombre N=a×b×c de Carmichaël alors qu'il y a visiblement des astuces de multiplicité qui permettent de drastiquement restreindre le nombre de diviseurs envisageables.

De plus, les trois égalités ci-dessus forme une triangulaire liant les trois facteurs premiers a b et c. Il en découle que pour un facteur premier a donné, il doit être possible de déterminer simultanément les couples de facteurs premiers (b,c) qui produisent un Nombre de Michaël N=a×b×c

Il existe donc un algorithme plus efficace qui serait de la forme:

Code : Tout sélectionner

Saisir M limite supérieure de la recherche
Pour tout nombre premier a (a<³√M)
:  Pour chaque couple de premiers (b,c) vérifiant le triangle des trois égalités de divisibilité 
:  :  Si a×b×c alors Afficher le Nombre de Carmichaël a×b×c


Je vous laisse méditer sur le moyen le plus efficace pour un facteur a premier donnée de trouver l'ensemble des couple de premiers (b,c) avec a < b < c qui vérifient le triangle des divisibilités:
  • ( a - 1 ) divise ( b × c -1)
  • ( b - 1 ) divise ( a × c -1 )
  • ( c - 1 ) divise ( a × b -1 )

hé hé hé :)
Dernière édition par C.Ret le 26 avr. 2020 16:22, édité 1 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7180
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

Re: Trouver les nombres de Carmichaël

Message par gege » 26 avr. 2020 00:12

Bonsoir,
En première lecture je me dis que mes pilules sont plus puissantes que tes pilules.
En seconde lecture, c'est amusant cette chasse dont nous devinons la fin...
Quand tu publieras ta solution, je montrerai ma pitoyable méthode.
A+
G.E.

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5593
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Trouver les nombres de Carmichaël

Message par Marge » 26 avr. 2020 02:38

Plus je lis C.Ret, plus je crie au génie.

Il y a des intelligences, dans leur domaine, qui me semblent indépassables.
Je me console avec ce que je peux, et c'est maigre.
Cela dit, en gros, ça va ! :wink:

Bravo C.Ret, continue, tu nous régales !
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Trouver les nombres de Carmichaël

Message par C.Ret » 03 mai 2020 14:48

gégé a publier un code pour vérifier sur l'autre fil du dimanche qu'il n'y avait pas d'autres Nombre de carmichaël multiples de 109 au-delà de la liste des presque dix nombres que j'avais imprimé.

Son code fort astucieux ressemble sous plusieurs de ces aspect à ceux que j'utilise :
gege a écrit :
26 avr. 2020 20:57
[…]Comme le nombre de Carmichaël cherché est multiple de 109, il est aussi de la forme 109 * (108 * L + 1), donc j'ai fait défiler un compteur L.
Si (108*L+1) n'a pas exactement deux facteurs, on l'ignore. Ensuite on vérifie les critères de divisibilité genre (N-1) divisible par (P-1) qui vont bien.
Ca donne :

Code : Tout sélectionner

EXPORT carmi3(l)
BEGIN
 LOCAL c;
 109*l[1]*l[3]-1▶c;
 IF 0≠irem(c,l[1]-1) THEN RETURN;END;
 IF 0≠irem(c,l[3]-1) THEN RETURN;END;
 PRINT({SORT({109,l[1],l[3]}),c})
END;

EXPORT carmi2(n,q)
BEGIN
 LOCAL d,m,f,g;
 108*q+1▶d;108*n▶n;
 WHILE n≥d DO
   mat2list(ifactors(d))▶f;SIZE(f)▶g;
   IF 4==g THEN
     IF 2==f[2]+f[4] THEN
       carmi3(f);END;END;
   108+d▶d;END;
PRINT(".")
END;
[…]On a bien rigolé.
G.E.
Et ce n'est pas fini ! :)

Pour trouver le Théorème de Horner nous indique qu'aucun Nombre de Carmichaël ne peut avoir de facteur premier carré.
Les Nombre de Carmichaël sont donc tous de la forme N=a×b×c×...a,b,c,... sont les facteurs premiers distincts de sa décomposition en produit.
Cette décomposition est unique d'après le théorème fondamental de la théorie des nombres.
Pour être sûr que tous ces facteurs sont distincts, je les désigne toujours dans l'ordre alphabétique tels que a<b<c<...
Comme il ne peut y avoir de Nombre de Carmichaël pair, on a de plus 2 < a < b < c < ...

Combien de facteurs ? Je ne sais pas. mais réfléchissons ensemble:

Un seul facteur:
Ce qui est sûr c'est que les nombres N=a ne peuvent être de Carmichaël car tous sont premiers.
Deux facteurs:
Si l'on considère les nombres N se décomposant en N=a×b avec a et b premeirs vérifiant a<b

Si N est Nombre de Carmichaël alors (a-1) divise (N-1) et (b-1) divise (N-1). Ce qui me parait possible à priori.
Mais rappelons nous le Lemme fondamental qui considère n=p×up est premier et u quelconque et qui affirme que (p-1) divise (n-1) si et seulement si (p-1) divise (u-1).

Donc, N=a×b est un nombre de Carmichaël si et seulement si (a-1) et (b-1) divisent tous deux (N-1).
D'après le lemme fondamental, (b-1) divise (N-1) si et seulement si (b-1) divise (a-1). Or c'est impossible car a<b implique que (b-1) > (a-1) et donc (b-1) ne peut en aucun cas diviser (a-1).
Et donc il n'existe pas de Nombre de Carmichaël se décomposant en uniquement deux facteurs premiers.

Trois facteurs: C'est le cas des Nombre de Carmichaël les plus simples à déterminer. Avec un peu de chance, la méthode constructive que l'on cherche appliquée aux nombres de la forme N=a×b×c donnera un indice pour la recherche des nombres N=a×b×c×... se décomposant en plus de trois facteurs.

On considère donc le Nombre de Carmichaël N=a×b×c avec a, b et c trois facteurs premiers distincts tels que 2 < a < b < c. On a donc (a-1), (b-1) et (c-1) qui divisent tous les trois (N-1).

Comme a, b et c sont tous les trois premiers, on applique le lemme fondamental et il en résulte les trois relations triangulaires suivantes:
  • (a-1) divise (b×c-1),
  • (b-1) divise (a×c-1) et
  • (c-1) divise (a×b-1)
Il existe donc trois entiers positifs i, j et k tels que :
  • b×c -1 = i × (a-1)
  • a×c - 1 = j × (b-1)
  • a×b - 1 = k × (c-1)


Comme a, b et c sont tous les trois premiers, on a nécessairement i > 1, j>1 et k>1.
En effet, si par exemple i=1, on aurait l'égalité b×c -1 = a-1 soit b×c = a ce qui est impossible pour a premier.
De même pour les deux autres relations.

Comme a, b et c sont tous les trois premiers impairs (donc au moins distant de deux unités), la relation d'ordre 2 < a < b < c implique que : 2 ≤ a-1 < a < a+1 < b-1 < b < b+1 < c-1 < c

Mais ce n'est pas pour autant que c peut être aussi grand que l'on veut; En effet (c-1) doit diviser (a×b-1) or, a×b est le produit des deux plus petit facteurs. Il existe donc une valeur limite pour c où il devient trop grand pour que (c-1) puisse être un diviseur.

C'est sur ce constat qu'est basé ma méthode constructive : a donne en quelque sort l'échelle (plus a est grand plus l'amplitude de la recherche s'accroit), b est le facteur à trouver et c est en quelque sorte la conséquence des choix pour a et b.


D'après la relation d'ordre on a : b < c-1 < c
Comme k >1 on en déduit que k×b < k×(c-1) < k×c.
Or k×(c-1) = a×b - 1 d'où k×b < a×b-1 < k×c
Puisque a×b - 1 < a×b et donc finalement k×b < a×b

On a donc un encadrement fort utile à la recherche des facteurs pour a donné; 1 < k < a

L'algorithme constructif prend forme. On se donne a et k avec 1 < k <a et l'on recherche les facteurs premiers b et c.

Cherchons une expression de b ne faisant intervenir que a et k.
On a déjà une relation de b en fonction a c j et k: j×(b -1) = a×c-1
Or a×c-1 = a×c -a+a -1= a×(c-1) + a -1 = a×(c-1)+(a-1)
D'où j×(b -1) = a×(c-1)+(a-1) dont je multiplie les deux termes par k :
On a j×k×(b -1) = a×k×(c-1)+k×(a-1)k×(c-1)=(a×b-1)

On a donc :
j×k×(b -1) = a×(a×b-1)+k×(a-1) relation où b apparait en présence d'uniquement a j et k.
En factorisant :
j×k×(b-1) = a×(a×(b-1)+a-1) +k×(a-1)
j×k×(b-1) = a²×(b-1)+a×(a-1) +k×(a-1)
j×k×(b-1) = a²×(b-1)+(a+k)×(a-1)
Soit
(b-1) × (j×k-a²) = (a+k) × (a-1)

Au lieu de chercher les j qui répondent à cette égalité, je pose D = j×k-a²

D a pas mal de propriétés qui vont nous servir à établir notre algorithme de recherche.

Primo : d'après sa définition D est un entier
De plus on a D MOD k = -a² donc D n'est pas un multiple de k, mais le reste de la division euclidienne de D par k fait -a² le diviseur étant le facteur j.

Secondo: D est un diviseur de (a+k)×(a-1) en effet : (b-1) = (a+k)×(a-1)/D
De plus on a D =(a+k)×(a-1)/(b-1)
Or d'après la relation d'ordre général : a-1 < b-1 d'où (a-1)/(b-1) < 1 et donc D < a+k

Voilà qu'à partir de a donné, on a des conditions pour k (1 < k < a ) et qu'à chaque k un diviseur D de (a+k)×(a-1) borné (D < a+k) dont le reste de la division par k fait -a². tout cela me semble être bien propice à un petit algo des maisons.

Prenons par exemple : a=3 la seule valeur possible est k=2 car 1 < k < a .
Calculons (a+k)×(a-1) = 5×2 = 10
Les diviseurs de 10 sont : 1 2 5 et 10 mais les diviseurs 5 et 10 ne sont pas à retenir car trop grands (D < 3+2 )
Le reste de -9 divisé par 2 est 1, D est donc impair.
Donc D ne peut prendre que la valeur D=1.
On a alors b-1 = 10/1 soit b=11 qui est premier.
D'où on calcule c-1 = (3×11-1)/2 = 16 soit c=17 qui lui aussi premier
Il nous reste à vérifier que (a-1) divise (11×17-1) ce qui est le cas car 186 est pair.

Donc, nous avons trouvé le seul Nombre de Carmichaël se décomposant en trois facteurs premiers dont le plus petit est 3.
3×11×17 = 561 qui est en fait le plus petit des Nombre de Carmichaël. Mais aussi le seul du type 3×b×c.

C'est mon doute quand à ce dernier fait qui m'a conduit à proposer la Question/Concours d'un dimanche après midi.


Pour faire plaisir à Marge, je vous donne en exemple l'implémentation de cet algorithme pour Hewlett Packard HP-28C/S:
HP-28S Carmichael 3 facteurs abc.gif
Liste Carmichaëls à trois facteurs a<b<c
HP-28S Carmichael 3 facteurs abc.gif (76.06 Kio) Consulté 2948 fois
Cette HP n'ayant pas de fonction native pour détecter les nombres premiers, il vous faudra composer votre propre fonction de détermination.
marge pourra utiliser selon son choix l'une des deux versions suivantes:
HP-28S ISPRIME (single scan).gif
Vérifie si l'argument est premier
HP-28S ISPRIME (single scan).gif (44.24 Kio) Consulté 2957 fois
HP-28S ISPRIME (dual scan).gif
Vérifie astucieusement si son argument est premier
HP-28S ISPRIME (dual scan).gif (69.2 Kio) Consulté 2957 fois
Evidemment, je préfère la seconde qui dispose d'un perfectionnement qui la rend bien plus efficace lorsque l'on souhaite déterminer la primalité de grands nombres.

Je mets également cette version pour le modèle historique SHARP PC-1211:
CRM3 factor SHARP PC1211.gif
Liste Carmichaëls à trois facteurs a<b<c
CRM3 factor SHARP PC1211.gif (32.89 Kio) Consulté 2957 fois

Comme pour l'HP-28S, la détermination de la primalité des nombres candidats est faite 'manuellement' et donc ces déterminations ne sont effectuées que quand cela est nécessaire à cause du temps que cela prend.

Malgré tout, même le SHARP PC-1211 s'en sort bien, il lui faut moins de 2'30" pour lister les Nombres de Carmichaël se décomposant en trois facteurs premier de la forme 13×b×c.

Code : Tout sélectionner

|>                      |  MODE DEF
|13_                    |  1 3 SHIFT A
|314821.=13.61.397.     |      0'24"
|115921.=13.37.241.     |      0'34"	
|530881.=13.97.421.     |      0'54"
|46657.=13.37.97.       |      1'21"
|29341.=13.37.61.       |      1'46"
|>                      |      2'23"
Bon évidemment, le même code sur HP-Prime affiche instantanément une telle liste :

Code : Tout sélectionner

EXPORT CRM3(A)
BEGIN
 0►N►M1;
 FOR K FROM 2 TO A-1 DO
     FOR D FROM −A*A MOD K TO A+K-1 STEP K DO 
         1+(A+K)*(A-1)/D ► B; 1+(A*B-1)/K ► C; (B*C) MOD (A-1) ► U; 
         IF U==1 THEN
             IF CAS.isprime(B) THEN
                IF CAS.isprime(C) THEN 1+N ► N; [A,B,C,A*B*C] ► M1(N); END;
 END;END;END;END;
 RETURN M1;
END;
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Répondre

Revenir vers « Tous les Pockets »