尤拉計劃700:尤拉幣

lt發表於2020-02-02

萊昂哈德·尤拉(Leonhard Euler)於1707年4月15日出生。

考慮序列1504170715041707n mod 4503599627370517。

如果此序列的一個元素嚴格小於所有先前發現的尤拉幣,則將其定義為尤拉幣。

例如,第一項是1504170715041707,這是第一個尤拉幣。 第二項是3008341430083414,該值大於1504170715041707,因此不是尤拉幣。 但是,第三項是8912517754604,它足夠小,可以用作新的尤拉幣。

因此,前2個尤拉幣的總和為1513083232796311。

找到所有尤拉幣的總和。

用黃志斌老師(https://www.ituring.com.cn/space/98916)提示的演算法

#改進歐幾里得演算法求線性方程的x與y
def get_(a, b):
 if b == 0:
  return 1, 0
 else:
  k = a // b
  remainder = a % b
  x1, y1 = get_(b, remainder)
  x, y = y1, x1 - k * y1
 return x, y

ec=1504170715041707
last_ec=1504170715041707
m =4503599627370517

s=set()
s.add(1)

for n in range(1,2*10**8):
 a=n*ec%m
 if a<last_ec:print(n,a);last_ec=a;s.add(a)

x,y=get_(ec,m)
inv=x%m
last_inv=x%m

for i in range(2,2*10**8):
 tmp=i*inv%m
 if tmp<last_inv:
  print (tmp,i);last_inv=tmp;s.add(i)

print(s)
print(sum(s))