J'ai d'abord pensé qu'il serait préférable d'utiliser la fraction continue de et de tester ses convergents, car à ces convergents il y a des points dans une certaine mesure une approximation optimale. Après cela, il devient clair, qu'il faut utiliser au moins les fractions continues généralisées pour s'assurer d'avoir des distances décroissantes monotones.
Après cela et l'algorithme compliqué avec cela, l'algo de force brute suivant était encore plus rapide dans Pari / GPlog(a)/log(b)(x,y)
\\ print X,Y,d conditional X>lowboundX, Y > lowboundY, d<upperboundD
{pri1(lbX,lbY,ubd,a,b,X,Y,d)=if(X<lbX || Y<lbY || abs(d)>ubd,return(0));
print(a,"^",X,"-",b,"^",Y,"=",d)); }
{mylist(maxa=19,maxb=99,lbX=3,lbY=2,ubd=100)=print(" ");
for(a=2,maxa,for(b=a+1,maxb,
if(gcd(a,b)>1,next()); \\ ignore trivial multiples
X=1;Y=1;Xa=a;Yb=b;
d=Xa-Yb; pri1(lbX,lbY,ubd,a,b,X,Y,d);
for(k=1,20,
while(d<0,Xa*=a;d=Xa-Yb;X++;pri1(lbX,lbY,ubd,a,b,X,Y,d););
while(d>0,Nb*=b;d=Xa-Yb;Y++;pri1(lbX,lbY,ubd,a,b,X,Y,d););
if(X>30 || Y>20, break()); \\ stop at max X=30 or Y=20
);
)); }
après cet appel mylist(100,1000,3,3,100)
pour trouver toute petite différence avec où les deux exposants sont au moins pour toutes les bases et . Vérifiez uniquement jusqu'à et . |d|<1003a=2..100b=(a+1)..1000max(X)=30max(y)=20
C'était beaucoup plus rapide que l'approche de la fraction continue (qui avait également plus de problèmes désagréables (par exemple avec l'exhaustivité des solutions) qui sont difficiles à gérer) bien qu'il s'agisse d'un algo quelque peu naïf ...
Un protocole (commandé manuellement):
gettime();mylist(200,10 000,3,3,100);gettime() /1000.0 \\ ~ a*b/6000 sec
(400 sec)
2^8- 3^5= 13
6^7-23^4= 95
2^7- 3^4= 47
2^7- 5^3= 3
2^5- 3^3= 5
3^4- 4^3= 17
---------------
2^6- 3^4=-17
3^5- 4^4=-13
2^5- 3^4=-49
2^8- 7^3=-87
(4^4- 7^3=-87)
3^7-13^3=-10
2^6- 5^3=-61
(4^3- 5^3=-61)
2^5- 5^3=-93
2^4- 3^3=-11
3^4- 5^3=-44
6^4-11^3=-35
15^4-37^3=-28
3^3- 4^3=-37
3^3- 5^3=-98
5^3- 6^3=-91