找回密码
 欢迎注册
楼主: gracias

[求助] fibonacci(10^14) % 1234567891011是多少?

[复制链接]
发表于 2012-2-20 22:37:16 | 显示全部楼层
(22:31) gp > m=[1,1;1,0]
%3 =
[1 1]

[1 0]

(22:35) gp > Mod(m,1234567891011)
%4 =
[Mod(1, 1234567891011) Mod(1, 1234567891011)]

[Mod(1, 1234567891011) Mod(0, 1234567891011)]

(22:35) gp > %4^(10^14-1)
%5 =
[Mod(921144120792, 1234567891011) Mod(512884989226, 1234567891011)]

[Mod(512884989226, 1234567891011) Mod(408259131566, 1234567891011)]

(22:35) gp > %5.[1,1]~
  ***   unknown member function: %5.[1,1]~
                                    ^------
(22:36) gp > %5*[1,1]~
%6 = [Mod(199461219007, 1234567891011), Mod(921144120792, 1234567891011)]~
(22:36) gp >
所以结果是921144120792

点评

nyy
我知道了,是\l打开记录log文件,然后从log文件中复制出来的  发表于 2024-1-8 13:07
nyy
你的结果是怎么搞出来的?直接从屏幕上复制下来的?  发表于 2024-1-5 15:48
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-20 22:40:09 | 显示全部楼层
11# mathe

这么快!!
我还以为要运行10^14次!
不亲自用Gp运行 我还不相信呢!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-20 22:41:47 | 显示全部楼层
大家都给出算法思想了,我的反应的确有点慢了,呵呵!
特别谢谢mathe 3次提醒,
  1. int M[2][2] = {{1,0}{0,1}}

  2.     int fib(int n)
  3.     {
  4.     matpow(n-1);
  5.     return M[0][0];
  6.     }

  7.     void matpow(int n)
  8.     {
  9.     if (n > 1) {
  10.         matpow(n/2);
  11.         M = M*M;
  12.     }
  13.     if (n is odd) M = M*{{1,1}{1,0}}
  14.     }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 08:25:36 | 显示全部楼层
引入了矩阵 之所以快  主要是因为二分式的模幂运算 避免了大量无谓的计算。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 08:48:48 | 显示全部楼层
其实写成$1/{sqrt{5}}(\omega^n+(-\omega)^{-n})$也可以用模幂运算
只是这时需要符号运算比较好。在模不是5的倍数下,我们知道$\omega$是方程$x^2-x-1=0$的根
也就是说,我们同样可以计算$\omega^n(mod m)$,只是这时,我们认为$\omega^2 -=\omega+1(mod m)$
于是任何时候,$\omega^k -=u_k+v_k*\omega (mod m)$
于是得出$\omega^{2k} -= (u_k+v_k*\omega)^2(mod m) -=u_k^2+2u_kv_k*\omega+v_k^2(\omega+1) -=(u_k^2+v_k^2)+(2u_kv_k+v_k^2)\omega(mod m)$

点评

nyy
利用数学归纳法可以证明:w^n=fibonacci(n-1)+fibonacci(n)*w,知道这个相对就容易搞定了!  发表于 2024-1-10 10:48
nyy
我在这完全按照你的思路来解决问题,有具体的思路与过程。https://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=4054&pid=98687  发表于 2024-1-9 12:19
nyy
你没写错,是我理解错了,你这确实是对m模幂,我的是降幂  发表于 2024-1-9 11:34
nyy
这个方法本质上是通过多项式除法实现降幂  发表于 2024-1-8 18:43
nyy
你这儿写错了,应该的对x^2-x-1取模,而不是对m取模  发表于 2024-1-8 12:40
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 09:30:48 | 显示全部楼层
方法很妙,但最后还有个$1/sqrt5$如何处理?

点评

nyy
利用数学归纳法可以证明:w^n=fibonacci(n-1)+fibonacci(n)*w(此处w同15楼w),所以根本与根号5没半毛钱关系。  发表于 2024-1-10 11:00
nyy
确实被约掉了,分母有根号5,分子必须有根号5,否则就不是整数了,具体见https://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=4054&pid=98687  发表于 2024-1-9 14:36
nyy
也可以把这个根号5踢给计算机,让计算机自己解决,见https://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=4054&pid=98685  发表于 2024-1-9 11:01
nyy
你的疑惑见https://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=4054&pid=98670  发表于 2024-1-8 14:50
nyy
说错了,是“既然分母有根号5,那么分子也应该有根号5呀”  发表于 2024-1-8 14:34
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 09:33:29 | 显示全部楼层
在32位系统下,可将1234567891011分解成(3*7*13*67*107)*630803 = 630803 * 1957137,
分别用 630803、1957137 为模计算,然后再用孙子定理,效率应该更高。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 10:13:38 | 显示全部楼层
15# mathe
我也正在想能不能针对fibonacci的特性,对模逆算法做一些定制,
mathe刚好正在做这一步,。。。
太精妙了!

可以用建一个数据结构,避免符号运算,另外

在模不是5的倍数下,我们知道ω是方程x2-x-1=0的根

这个在任何情况下都成立的吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 11:09:13 | 显示全部楼层
(22:31) gp > m=[1,1;1,0]
%3 =
[1 1]

[1 0]

(22:35) gp > Mod(m,1234567891011)
%4 =
[Mod(1, 1234567891011) Mod(1, 1234567891011)]

[Mod(1, 1234567891011) Mod(0, 1234567891011)]

(22:35) gp  ...
mathe 发表于 2012-2-20 22:37


完全能看懂,第一次知道pari/gp可以计算矩阵的模幂,
我以前只是用它计算整数的模幂,跟mathe学到了以前
不知道的知识
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-2-21 11:10:45 | 显示全部楼层
这个其实不就是lucas序列吗?其实郭的素性判定算法中有,我在第一个回复的时候就说了,只是郭愿不愿意显露他的身手而已!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-20 13:39 , Processed in 0.059269 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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