Güçler arasındaki mesafeyi hesaplamak için algoritma


9

verildiğinde hızlı bir şekildebir,b

minx,y>0|birx-by|

Burada x,y tamsayılardır. Açıkçası x=y=0 ilginç bir cevap veriyor; genel olarak bu güçler ne kadar yaklaşabilir? Ayrıca, minimizing x, y'yi hızlı bir şekilde nasıl hesaplayabiliriz x,y?


6
Bunun hesaplanabilir olduğunu biliyor musunuz?

1
Eğer düzeltmek ise , o asgarileştirir için, göstermek kolaydır . Bu onu tek boyutlu bir aramaya indirger. xy{xgünlükbirgünlükb,xgünlükbirgünlükb}
Thomas

5
Lütfen aynı anda çapraz posta göndermeyin veya en azından diğer yayınlara bağlantı vermeyin. mathoverflow.net/questions/283903/…
usul

Yanıtlar:


-2

İlk önce nin sürekli kesirini kullanmanın ve yakınsamalarında test etmenin en iyi olacağını düşündüm , çünkü bu yakınsaklarda bir anlamda optimal yaklaşımın noktaları . Bundan sonra, monotonik azalan mesafelere sahip olduğundan emin olmak için en azından genelleştirilmiş sürekli kesirleri kullanması gerektiği anlaşılmaktadır . Bundan sonra ve bununla birlikte karmaşık algoritma, aşağıdaki kaba kuvvet algou Pari / GP'de daha da hızlıydıgünlük(bir)/günlük(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 
       );
   )); }

Bu çağrıdan sonra mylist(100,1000,3,3,100)tüm küçük bir fark bulmak için burada her iki üs ve tüm bazlar için en az . Yalnızca ve . |d|<1003bir=2..100b=(bir+1)..1000maksimum(X)=30maksimum(y)=20

Bu, bir şekilde naif bir algo olmasına rağmen (aynı zamanda ele alınması zor olan daha kaba konular (örneğin, çözümlerin bütünlüğü ile) vardı) sürekli kesir yaklaşımından çok daha hızlıydı ...

Bir protokol (manuel olarak sıralanmış):

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.