Une etude avec le logiciel Maple Un palindrome : tu l'as trop écrasé césar ce port-salut Un Annagramme strict : mizony, ynozim recherche des nombres "palindromes" a qui verifient 9a et a sont annagrammes stricts en base 10. Exemple de programme "brutal" pa:=proc(n) local i,j,L,m; for i to n do L:=convert(i,base,10); j:=add(L[nops(L)-m+1]*10^(m-1),m=1..nops(L)); if 9*i=j then print(`un palindrome`,i,9*i) fi od; end; pa(20000);# c'est long pour trouver les deux premiers 1089 et 10989 Utilisant une premiere remarque :le nombre a cherch'e ne peut se terminer que par un 9, un programme 10 fois plus rapide : paplus:=proc(n) local i,j,L,m; for i from 9 by 10 to n do L:=convert(i,base,10); j:=add(L[nops(L)-m+1]*10^(m-1),m=1..nops(L)); if 9*i=j then print(`un palindrome`,i,9*i) fi od; end; paplus(2000); ce n'est guere satisfaisant! Alors un peu de maths: lemme 1: 9*a etant divisible par 9 et a ayant les memes chiffres que 9*a, a est divisible par 9 lemme 2: a est de la forme 10...89. d'ou un algotithme plus rapide : Pa:=proc(n) local i,ii,j,L,m; for i from 0 by 9 to n do ii:=100*i+89+10^(length(i)+3); L:=convert(ii,base,10); j:=add(L[nops(L)-m+1]*10^(m-1),m=1..nops(L)); if 9*ii=j then print(`un palindrome`,ii,9*ii) fi od; end: En voici le resultat : Pa(10000); un palindrome, 1089, 9801 un palindrome, 10989, 98901 un palindrome, 109989, 989901 un palindrome, 1099989, 9899901 un palindrome, 10891089, 98019801 un palindrome, 10999989, 98999901 Allons plus loin : lemme 3: soit a une solution, b un mot de chiffres, alors c=aba, obtenu par concatenation est une solution, si b*, obtenu a partir de b en supprimant un nombre maximum et egal de zeros a ses extremites, est une solution ou le mot vide. Definition : nous appellerons solution irreductible, toute solution n'admettant pas de sous-mot solution. par exemple 10891089, 108901098901089 sont des solutions qui ne sont pas irreductibles. Problemes: 1- comment demontrer simplement que toutes les solutions irreductibles sont de la forme a=10999...989. (je connais une preuve, mais elle est fastidieuse). 2- comment demontrer que toute solution est divisible par 11; (si une solution a un nombre pair de chiffres, alors elle est divisible par 11, car 5*a=(9*a+a)/2 est un mot palindrome ayant un nombre pair de chiffres). C'est joli ! Une etude de factorisation nous montre que ces nombres sont divisibles par 9*11=99 et que le quotient de a par 99 est un nombre form'e que de 1, sil est irreductible. D'ou, Une generation des nombres palindromiques irreductibles. a:=proc(n) local i,L; L:=[9,8,seq(9,i=1..n-2),0,1]; sum(L[j]*10^(j-1),j=1..2+n); end: seq([a(n),9*a(n)],n=2..6); seq(a(n)/99,n=2..6); On introduit alors les polynomes 1+X+X^2+...+X^n. Pa:=proc(n) local i; global Q; Q:=sum(X^i,i=0..n-1); 99*subs(X=10,Q) end: (L'idee d'introduire ces polynomes n'a pas ete immediate pour moi) verification: seq([a(n),Pa(n)],n=2..6); Or on obtient 9 comme 10-1 et 99 comme 10^2-1. Ceci m'a suggere le recours aux polynomes dits cyclotomiques dont voici une definition : Definition 2: Le nieme polynome cyclotomique est le produit des monomes X-alpha, avec alpha parcourant les racines primitives nieme de l'unite. ( i.e. alpha est zero de X^n-1, sans etre zero de X^k-1, pour k0 and gcd(k1,2*k3+1)=1 then r:=essai(k1,k2,k3); if r>0 then print(r,99*r,[k1,k2,2*k3+1]) fi; fi; od; od; od; (On a utilise les faits que - pour "k3 pair", il n'y a pas de solution. - et pour 2k1+2k3+1=0 modulo 3 non plus. Resultats de nombres palindromes composes de la forme "99*premier": 1100011100011, 108901098901089, 980109890109801 110000011111110000011, 10890001099999890001089, 98010009899999010009801 1100000001111111111111111111000000011, 108900000109999999999999999989000001089, 980100000989999999999999999901000009801 11000000001110000000011, 1089000000109890000001089, 9801000000989010000009801 111000011111110000111, 10989001099999890010989, 98901009899999010098901 111000001111111111100000111, 10989000109999999998900010989, 98901000989999999990100098901 11100000011111000000111, 1098900001099989000010989, 9890100009899901000098901 11100000011111111111111111000000111, 1098900001099999999999999989000010989, 9890100009899999999999999901000098901 111100111001111, 10998910989109989, 98990198901989901 111100000001111111111100000001111, 10998900000109999999998900000109989, 98990100000989999999990100000989901 111110000111000011111, 10999890010989001099989, 98999010098901009899901 1111100000000011111111100000000011111, 109998900000001099999998900000001099989, 989990100000009899999990100000009899901 On peut revoir ces resultats a partir des polynomes cyc:=proc(k1,k2,k3) local X,P; P:=(X^k1-1)/(X-1)*(X^(k1+2*k2+k3)+1)+(X^k3-1)/(X-1)*X^(k1+k2); factor(P),99*subs(X=10,P); end: On remarque que si d est le pgcd de k1 et k3, X^d-1 divise P; on remarque aussi que 2k1+2k3+1>0 modulo 3 generalise le fait que le PGCD de k1 et de 2*k3+1 soit 1 (gcd(k1,2*k3+1)=1). Ce recours "abstrait" permet d'ameliorer l'algorithme precedent : for k1 from 2 to 10 do for k3 to 10 do u:=2*k1+2*k3+1; if isprime(u) then for k2 from 2 to 10 do if modp(k2,u)>0 and modp(k2+k1+2*k3+1,u)>0 then r:=essai(k1,k2,k3); if r>0 then print(r,[k1,k2,2*k3+1]) fi; fi; od; fi; od; od; Etc ... Esope reste ici et se repose