鱼C论坛

 找回密码
 立即注册
查看: 2975|回复: 4

题目137:考察系数为斐波那契数的无限多项式序列的值

[复制链接]
发表于 2016-8-27 02:04:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 欧拉计划 于 2016-8-27 02:06 编辑
Fibonacci golden nuggets

Consider the infinite polynomial series AF(x) = xF1 + x2F2 + x3F3 + ..., where Fk is the kth term in the Fibonacci sequence: 1, 1, 2, 3, 5, 8, ... ; that is, Fk = Fk−1 + Fk−2, F1 = 1 and F2 = 1.

For this problem we shall be interested in values of x for which AF(x) is a positive integer.

Surprisingly AF(1/2)         =         (1/2).1 + (1/2)2.1 + (1/2)3.2 + (1/2)4.3 + (1/2)5.5 + ...
                                         =         1/2 + 1/4 + 2/8 + 3/16 + 5/32 + ...
                                         =         2
The corresponding values of x for the first five natural numbers are shown below.

QQ20160827-1@2x.png


We shall call AF(x) a golden nugget if x is rational, because they become increasingly rarer; for example, the 10th golden nugget is 74049690.

Find the 15th golden nugget.

题目:

考虑无限多项式序列 AF(x) = xF1 + x2F2 + x3F3 + ...,其中 Fk 是斐波那契数列中的第 k 项。1,1,2,3,5,8,...;也就是说 Fk = Fk−1 + Fk−2 ,F1 = 1,F2 = 1.

在本题中我们考虑使得 AF(x) 为正整数的 x 值。

有趣的是,AF(1/2)        =        (1/2).1 + (1/2)2.1 + (1/2)3.2 + (1/2)4.3 + (1/2)5.5 + ...
                                    =        1/2 + 1/4 + 2/8 + 3/16 + 5/32 + ...
                                    =        2

前五个自然数对应的 x 值如下表所示:

QQ20160827-1@2x.png


如果 x 是有理数,我们称 AF(x) 为一个金块,因为这样的数非常之少;例如,第 10 个金块是 74049690。

找出第 15 个金块。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-20 10:26:59 | 显示全部楼层
这题一开始拿到手感觉是比较难的,没方向,然后去维基百科查了Af(x)的公式:x / (1-x-x**2),有了公式就好办了。假设 x / (1-x-x**2) = n,nx**2+(n+1)x-n=0,根据b^2-4ac = 5n^2+2n+1必须是完全平方数。
  1. from numba import jit
  2. @jit
  3. def solve(c):
  4.         count = 0
  5.         n = 0
  6.         while count < c:
  7.                 n += 1
  8.                 if int((5*n*n+2*n+1)**0.5)**2 == 5*n*n+2*n+1:
  9.                         print(n)
  10.                         count += 1
  11.         return n
  12. solve(10)
复制代码

2
15
104
714
4895
33552
229970
1576239
10803704
74049690
前10个都是正确的,其实可以一直算到第15个,但是由于大数开方的误差问题,导致开方后的数不正确。

我们通过观察前10个数,可以发现,其实他们就是Fib数列的连续项的乘积,例如,1*2=2, 3*5=15, 8*13=104...
既然这样,这个问题就又可以转化为:
  1. from functools import lru_cache
  2. @lru_cache(maxsize=None)
  3. def fib(n):
  4.         return n if n < 3 else fib(n-1)+fib(n-2)

  5. print(fib(29)*fib(30))
复制代码

答案就是:
1120149658760

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
SixPy + 5 + 5 + 5 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-20 18:44:18 | 显示全部楼层
jerryxjr1220 发表于 2017-7-20 10:26
这题一开始拿到手感觉是比较难的,没方向,然后去维基百科查了Af(x)的公式:x / (1-x-x**2),有了公式就 ...

如果你的推理是正确的话
计算就很简单了
  1. >>> def fib_gen(n):
  2.     if n<=0: return None
  3.     a,b = 0,1
  4.     if n>=1: yield a
  5.     if n>=2: yield b
  6.     for i in range(n-2):
  7.         a, b = b, a+b
  8.         yield b

  9.         
  10. >>> def fib_gold(n):
  11.         return [x*y for x,y in zip(*([fib_gen(n*2+2)]*2))]

  12. >>> fib_gold(15)
  13. [0, 2, 15, 104, 714, 4895, 33552, 229970, 1576239, 10803704, 74049690, 507544127, 3478759200, 23843770274, 163427632719, 1120149658760]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 21:05:17 | 显示全部楼层
没有通过严格数学证明的解法为令x=F(i)/F(i+1)。代入函数
f(x)中得f(F(i)/F(i+1)=F(i)*F(i+1)/(F(i-1)*F(i+1)-F(i)^2)
再根据斐波那契数列的特性知:F(i-1)*F(i+1)-F(i)^2=(-1)^i
所以f(F(i)/F(i+1))=(-1)^i F(i)*F(i+1),由于函数值是正的故i只能取偶数。
所以取i=2得第一个黄金块2,取i=4得第二个黄金块15
...
取i=20得第10个黄金块74049690。
所以我们猜想第i个黄金块的值是F(2*i)*F(2*i+1)
结论是对的,但我无法证明方程的有理数解就只有这种形式!
答案:1120149658760
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-18 22:51:57 | 显示全部楼层
本帖最后由 guosl 于 2022-9-18 22:59 编辑

另一种解法:
假设 x / (1-x-x**2) = n,nx**2+(n+1)x-n=0,根据b^2-4ac = 5n^2+2n+1必须是完全平方数。令:m^2=5n^2+2n+1,则得二元二次不定方程:5x^2-y^2+2x+1=0,而根据
https://www.alpertron.com.ar/QUAD.HTM中给出的这个方程的解的递推公式,我们可以得到这个方程的所有整数解,而问题要求的解就是这些解中的正整数解。
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;

  5. int main(void)
  6. {
  7.   long long x1 = 0, y1 = 1, x2, y2;
  8.   vector<long long> vr;
  9.   for (int i = 1; i <= 10; ++i)
  10.   {
  11.     x2 = -9 * x1 + 4 * y1 - 2;
  12.     y2 = 20 * x1 - 9 * y1 + 4;
  13.     if (x2 >0)
  14.       vr.push_back(x2);
  15.     x1 = x2;
  16.     y1 = y2;
  17.   }
  18.   x1 = 2;
  19.   y1 = 5;
  20.   for (int i = 1; i <= 10; ++i)
  21.   {
  22.     x2 = -9 * x1 + 4 * y1 - 2;
  23.     y2 = 20 * x1 - 9 * y1 + 4;
  24.     if (x2 > 0)
  25.       vr.push_back(x2);
  26.     x1 = x2;
  27.     y1 = y2;
  28.   }
  29.   x1 = 0;
  30.   y1 = -1;
  31.   for (int i = 1; i <= 10; ++i)
  32.   {
  33.     x2 = -9 * x1 + 4 * y1 - 2;
  34.     y2 = 20 * x1 - 9 * y1 + 4;
  35.     if (x2 > 0)
  36.       vr.push_back(x2);
  37.     x1 = x2;
  38.     y1 = y2;
  39.   }
  40.   x1 = -1;
  41.   y1 = 2;
  42.   for (int i = 1; i <= 10; ++i)
  43.   {
  44.     x2 = -9 * x1 + 4 * y1 - 2;
  45.     y2 = 20 * x1 - 9 * y1 + 4;
  46.     if (x2 > 0)
  47.       vr.push_back(x2);
  48.     x1 = x2;
  49.     y1 = y2;
  50.   }
  51.   x1 = -1;
  52.   y1 = -2;
  53.   for (int i = 1; i <= 10; ++i)
  54.   {
  55.     x2 = -9 * x1 + 4 * y1 - 2;
  56.     y2 = 20 * x1 - 9 * y1 + 4;
  57.     if (x2 > 0)
  58.       vr.push_back(x2);
  59.     x1 = x2;
  60.     y1 = y2;
  61.   }
  62.   x1 = 0;
  63.   y1 = 1;
  64.   for (int i = 1; i <= 10; ++i)
  65.   {
  66.     x2 = -9 * x1 - 4 * y1 - 2;
  67.     y2 = -20 * x1 - 9 * y1 - 4;
  68.     if (x2 >0)
  69.       vr.push_back(x2);
  70.     x1 = x2;
  71.     y1 = y2;
  72.   }
  73.   x1 = 2;
  74.   y1 = 5;
  75.   for (int i = 1; i <= 10; ++i)
  76.   {
  77.     x2 = -9 * x1 - 4 * y1 - 2;
  78.     y2 = -20 * x1 - 9 * y1 - 4;
  79.     if (x2 > 0)
  80.       vr.push_back(x2);
  81.     x1 = x2;
  82.     y1 = y2;
  83.   }
  84.   x1 = 0;
  85.   y1 = -1;
  86.   for (int i = 1; i <= 10; ++i)
  87.   {
  88.     x2 = -9 * x1 - 4 * y1 - 2;
  89.     y2 = -20 * x1 - 9 * y1 - 4;
  90.     if (x2 > 0)
  91.       vr.push_back(x2);
  92.     x1 = x2;
  93.     y1 = y2;
  94.   }
  95.   x1 = -1;
  96.   y1 = 2;
  97.   for (int i = 1; i <= 10; ++i)
  98.   {
  99.     x2 = -9 * x1 - 4 * y1 - 2;
  100.     y2 = -20 * x1 - 9 * y1 - 4;
  101.     if (x2 > 0)
  102.       vr.push_back(x2);
  103.     x1 = x2;
  104.     y1 = y2;
  105.   }
  106.   x1 = -1;
  107.   y1 = -2;
  108.   for (int i = 1; i <= 10; ++i)
  109.   {
  110.     x2 = -9 * x1 - 4 * y1 - 2;
  111.     y2 = -20 * x1 - 9 * y1 - 4;
  112.     if (x2 > 0)
  113.       vr.push_back(x2);
  114.     x1 = x2;
  115.     y1 = y2;
  116.   }
  117.   sort(vr.begin(), vr.end());
  118.   unique(vr.begin(), vr.end());
  119.   cout << vr[14] << endl;
  120.   return 0;
  121. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-20 01:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表