当前位置: 代码迷 >> 综合 >> Project Euler problem 66
  详细解决方案

Project Euler problem 66

热度:17   发布时间:2024-01-13 17:25:34.0

pell方程及连分数

wiki如下

http://zh.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95%B8

http://zh.wikipedia.org/zh-cn/%E4%BD%A9%E5%B0%94%E6%96%B9%E7%A8%8B


主要应用的是 

对于连分数 ,前四个收敛(编号  到 )是

用普通语言来说,第 3 个收敛的分子是借由第 3 个商()乘上第 2 个收敛的分子,并加上第 1 个收敛的分子而成。分母的形成也很类似。

如果找到连续的收敛,带有分子  和分母 ,则相关的递归关系是:

连续的收敛由如下公式给出


如果 a0a1a2, ... 是正整数的无限序列,递归的定义序列  和 :

     
     
然后是pell方程的理论


 是的连分数表示:的渐近分数列,由连分数理论知存在  使得(pi,qi) 为佩尔方程的解。取其中最小的 ,将对应的 (pi,qi) 称为佩尔方程的基本解,或最小解,记作(x1,y1)

例如:

首先根据根号7的渐进连分数表示,找出前几项,察看(分子,分母)是否是一组解。

第一项: ,  不是解;
第二项: ,   不是解;
第三项: ,  不是解;
第四项: ,   是解。

于是最小解是(8,3)。计算的各次乘方,或者用递推公式(不能直接得出某一项)就可以得到接下来的各组解

(8,3)、 (127,48)、 (2024,765)、 (32257,12192)、 (514088,194307)、 (8193151;3096720)、 (130576328,49353213) ......



然后我就可以用python写代码咯

import math
def gao(n):  m = int(math.sqrt(n))  if m * m == n:  return 0 ha = 1; ka = 0d = m  a = n  b = -m  c = 1hb = d; kb = 1if hb * hb - n * kb * kb == 1:return hbwhile True:  nc =  a - b * b  nc /= c  nd = int((math.sqrt(a) - b) / nc)  nb = -b - nd * ncc = nc; d = nd; b = nb;hc = d * hb + hakc = d * kb + kaha = hbka = kbhb = hckb = kcif hc * hc - n * kc * kc == 1:return hcreturn 0
ans = 0
tmp = 0
for i in range(1, 1001):z = gao(i)if z > tmp:tmp = zans = i
print ans


  相关解决方案