Algorithm 如何使我的斐波那契与模运算更有效地找到皮萨诺循环?

Algorithm 如何使我的斐波那契与模运算更有效地找到皮萨诺循环?,algorithm,performance,python-3.x,fibonacci,mod,Algorithm,Performance,Python 3.x,Fibonacci,Mod,出于教育目的,我正在Python3中构建一个代码,以实现以下目标: 我认为我在这个问题上做得很好,因为我是初级/中级水平。这是一个高级问题,不是必须解决的问题 我用一个缓慢但安全的函数作为对照组进行压力测试。在那之后,我能够创建一个更快的函数 然而,对于某些pisano周期,我的实现是有问题的。 正如你在这里看到的: 一些MOD可以产生巨大的周期性周期 对于像这样的mod,我的函数运行得非常快。你应该用模运算来计算Fibonacci数,而不是计算循环长度,因为循环长度有一个对数算法 所需的总迭代

出于教育目的,我正在Python3中构建一个代码,以实现以下目标:

我认为我在这个问题上做得很好,因为我是初级/中级水平。这是一个高级问题,不是必须解决的问题

我用一个缓慢但安全的函数作为对照组进行压力测试。在那之后,我能够创建一个更快的函数

然而,对于某些pisano周期,我的实现是有问题的。 正如你在这里看到的: 一些MOD可以产生巨大的周期性周期


对于像这样的mod,我的函数运行得非常快。你应该用模运算来计算Fibonacci数,而不是计算循环长度,因为循环长度有一个对数算法

所需的总迭代次数肯定低于显式计算pisano循环长度所需的迭代次数

你必须利用的关系是

fib(2n) = fib(n) * ( 2 * fib(n+1) - fib(n) )
fib(2n+1) = fib(n+1) ^ 2 + fib(n) ^ 2

如果在模运算中进行乘法和加法运算,则可以使用整数数据类型10^5<2^17获得精确结果。

应使用模运算计算斐波那契数,而不是计算循环长度,因为循环长度有对数算法

所需的总迭代次数肯定低于显式计算pisano循环长度所需的迭代次数

你必须利用的关系是

fib(2n) = fib(n) * ( 2 * fib(n+1) - fib(n) )
fib(2n+1) = fib(n+1) ^ 2 + fib(n) ^ 2

如果你在模运算中进行乘法和加法运算,你可以使用整数数据类型10^5<2^17来获得精确的结果。

我投票结束这个问题,因为它应该在@MadPhysicator上,但这是一个效率问题。。。我并不是想让代码看起来更好,也不是为了代码本身而重构。。。我有一个错误,它不允许我完成目标…代码审查并不是为了让代码看起来更漂亮。这样做是为了改进代码的某些特定功能,通常是可维护性或效率。请参阅。你想用矩阵求幂法和标准的求幂算法,或者用指数的二元分解,或者用指数倍增规则,这两种方法都可以解决同样的问题。我根本不是一个专业人士,事实上,我收回了我的投票,因为你在这里得到了答案。我的错误。我很高兴你找到了你想要的。我投票结束这个问题,因为它应该在@MadPhysical上,但这是一个效率问题。。。我并不是想让代码看起来更好,也不是为了代码本身而重构。。。我有一个错误,它不允许我完成目标…代码审查并不是为了让代码看起来更漂亮。这样做是为了改进代码的某些特定功能,通常是可维护性或效率。请参阅。你想用矩阵求幂法和标准的求幂算法,或者用指数的二元分解,或者用指数倍增规则,这两种方法都可以解决同样的问题。我根本不是一个专业人士,事实上,我收回了我的投票,因为你在这里得到了答案。我的错误。我很高兴你找到了你要找的东西。
10249
   def generate_big_pisano_list(mod):
        big_list = []
        if mod<249:
            limit = 700
        if 249<=mod<1000:
            limit = 3001
        else:
            limit = 6000
fib(2n) = fib(n) * ( 2 * fib(n+1) - fib(n) )
fib(2n+1) = fib(n+1) ^ 2 + fib(n) ^ 2