Algorithme pour calculer la distance entre les puissances

9

Étant donné le coprime , pouvez-vous calculer rapidementa,b

minx,y>0|axby|

Ici x,y sont des entiers. Évidemment, prendre x=y=0 donne une réponse sans intérêt; en général, à quel point ces pouvoirs peuvent-ils se rapprocher? De plus, comment calculer rapidement la minimisation de x,y ?

Gautam
la source
6
Savez-vous que c'est même calculable?
1
Si vous corrigez x , il est facile de montrer que, pour le minimiseur, y{xlogalogb,xlogalogb} . Cela le réduit à une recherche unidimensionnelle.
Thomas
5
Veuillez ne pas effectuer de cross-post simultanément, ou du moins créer un lien vers les autres articles. mathoverflow.net/questions/283903/…
usul

Réponses:

-2

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
Heaumes Gottfried
la source