Đầu tiên tôi nghĩ tốt nhất nên sử dụng phần tiếp theo của và kiểm tra tại các điểm hội tụ của nó, bởi vì tại đó hội tụ có các điểm trong một số xấp xỉ tối ưu. Sau đó, mọi thứ trở nên rõ ràng, người ta cần sử dụng ít nhất các phân số tiếp tục tổng quát để đảm bảo có khoảng cách giảm đơn điệu.
Sau đó và thuật toán phức tạp với thuật toán vũ phu sau đây thậm chí còn nhanh hơn trong 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
);
)); }
sau cuộc gọi đó mylist(100,1000,3,3,100)
để tìm tất cả sự khác biệt nhỏ với trong đó cả hai số mũ đều có ít nhất cho tất cả các cơ sở và . Chỉ kiểm tra và . |d|<1003a=2..100b=(a+1)..1000max(X)=30max(y)=20
Cách này nhanh hơn nhiều so với cách tiếp cận phân đoạn tiếp tục (cũng có nhiều vấn đề không tốt (ví dụ như tính đầy đủ của các giải pháp) rất khó xử lý) mặc dù đó là một thuật toán ngây thơ ...
Một giao thức (được đặt hàng thủ công):
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