Python 探讨斐波拉契数列模素数的周期问题之目录

  • 前言
  • 一、生成斐波拉契数列
  • 二、创建素数列表
  • 三、搜索周期数列的循环节
    • 3.1 斐波拉契数列模 p p p 的周期
    • 3.2 循环节的搜寻代码
    • 3.3 完整实现斐波拉契数列模 p p p 循环节
  • 四、面向未来的问题

前言

定义 \; 斐波拉契数列又称黄金分割数列,是指数列 1、1、2、3、5、8、13、21、34、55 …,通过递推的方式可准确定义为 F 0 = 0 , F 1 = 1 , F n = F n − 1 + F n − 2 , ( n ≥ 2 , n ∈ N ∗ ) F_0=0, \; F_1=1, \; F_n=F_{n-1}+F_{n-2}, \; (n \geq 2, n ∈ N^*) F0​=0,F1​=1,Fn​=Fn−1​+Fn−2​,(n≥2,n∈N∗)

记 ω = 1 + 5 2 \omega =\frac{1+\sqrt{5}}{2} ω=21+5 ​​ , ω ˉ = 1 − 5 2 \bar{\omega} =\frac{1-\sqrt{5}}{2} ωˉ=21−5 ​​ ,则有斐波拉契数列的通项公式: F n = 1 5 ( ω n + ω ˉ n ) F_n = \frac{1}{\sqrt{5}} \left( \omega^n + \bar{\omega}^n \right) Fn​=5 ​1​(ωn+ωˉn)

性质 \; 斐波拉契数列前一项与后一项之比的极限为黄金分割比,即有 lim ⁡ n → + ∞ F n F n + 1 = 5 − 1 2 \lim_{n \to +\infty} \frac{F_n}{F_{n+1}} = \frac{\sqrt{5}-1}{2} n→+∞lim​Fn+1​Fn​​=25 ​−1​


一、生成斐波拉契数列

按照递推公式即可写出如下代码:

def fibonacci(n):a, b = 0, 1for i in range(n):a, b = b, a + byield a

使用 list(fibonacci(10)) 便输出 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 。

二、创建素数列表

此步方法比较多,大家可以自己发挥,最后使用 primes(20) 要能输出小于 20 20 20 的全体素数 [2, 3, 5, 7, 11, 13, 17, 19] 。本文中至少要求我们能快速生成 10000 10000 10000 以内的素数即可,这是容易实现的,代码不再展示。

三、搜索周期数列的循环节

3.1 斐波拉契数列模 p p p 的周期

关于一般周期数列循环节的讨论,原本是比较麻烦的,但由于斐波拉契数列模素数 p p p 的周期很有规律,因此可以简单进行编程处理。

首先解释一下循环节的含义,循环节是指周期数列里一个最小正周期里的子数列。比如周期数列 [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, …] 里的循环节为 [1, 2, 3] 。

周期数列的周期往往是指该数列循环节的长度,比如上面的周期数列,其周期为 3 3 3 。

斐波拉契数列模素数 p p p 之后形成的新的数列是一个周期数列,我们对于该周期数列的循环节和周期都是十分感兴趣的。

在此,我们给出一个重要结论:

定理 \; 设 { F n } \{ F_n \} {Fn​} 为斐波拉契数列, p p p 为大于 5 5 5 的素数,数列 F \mathscr{F} F 为斐波拉契数列 { F n } \{ F_n \} {Fn​} 模素数 p p p 后的新数列,则当 p = 1 , 4 m o d 5 p = 1, 4 \mod 5 p=1,4mod5 时, F \mathscr{F} F 的周期为 p − 1 p-1 p−1 或 p − 1 p-1 p−1 的因子;当 p = 2 , 3 m o d 5 p = 2, 3 \mod 5 p=2,3mod5 时, F \mathscr{F} F 的周期为 2 p + 2 2p+2 2p+2 或 2 p + 2 2p+2 2p+2 的因子。

上述定理的证明详见论文 The Period of the Fibonacci Sequence Modulo j 中的定理5定理6

上述定理告述我们,斐波拉契数列模 p p p 的周期最多为 2 p + 2 2p+2 2p+2 。因此对于模 10000 10000 10000 以内的素数,最大的一个素数为 9973 9973 9973,其周期最多为 19948 19948 19948 。算法仅要求两个周期的匹配即可,故需要至少前 19948 ⋅ 2 = 39896 19948 \cdot 2 = 39896 19948⋅2=39896 个斐波拉契数。本文我们取前 40000 40000 40000 个斐波拉契数,让他们皆模 p p p 产生周期数列 F \mathscr{F} F 。

3.2 循环节的搜寻代码

我们按照上述要求,编写循环节搜寻的 Python 代码:

lstt = [7,1,4,2,8,5,0,7,1,4,2,8,5,0,7,1,4,2]
t = len(lstt)//2
s = 0for k in range(2, t+1):if lstt[0:k]==lstt[k:2*k]:print(lstt[0:k])print(f'循环节长度为:{len(lstt[0:k])}')print(f'不同元素个数为:{len(set(lstt[0:k]))}', '\n')s +=1break

输出结果如下:

[7, 1, 4, 2, 8, 5, 0]
循环节长度为:7
不同元素个数为:7

3.3 完整实现斐波拉契数列模 p p p 循环节

a = primes(10000)
b = list(fibonacci(40000))s = 0
u = 0
r = 0
lst_1 = []
lst_2 = []for i in a:lst = []for j in b:lst.append(j % i)# 计算数列中的循环节t = len(lst)//2for k in range(2, t+1):if lst[0:k]==lst[k:2*k]:print(lst[0:k])print(f'循环节长度为:{len(lst[0:k])}')print(f'p={i} 时循环节的不同元素个数为:{len(set(lst[0:k]))}')if len(lst[0:k])==2*i+2:print(f'最小正周期等于 2p+2', '\n')lst_1.append(i)u +=1elif len(lst[0:k])==i-1:print(f'最小正周期等于 p-1', '\n')lst_2.append(i)r +=1else:print('\n')s +=1breakprint(f'一共有 {s} 个循环节被输出')
print(f'一共有 {len(a)} 个素数被讨论')
print(f'一共有 {u} 个模数 p 满足最小正周期等于 2p+2')
print(f'满足最小正周期等于 2p+2 的 p 为:{lst_1}')
print(f'一共有 {r} 个模数 p 满足最小正周期等于 p-1')
print(f'满足最小正周期等于 p-1 的 p 为:{lst_2}')
print(f'满足最小正周期等于 2p+2 或 p-1 的占比为:{(u+r)/s}')

我们只挑部分输出如下:

一共有 1229 个素数被讨论
一共有 487 个模数 p 满足最小正周期等于 2p+2
一共有 322 个模数 p 满足最小正周期等于 p-1
满足最小正周期等于 2p+2 或 p-1 的占比为:0.6582587469487388

上述结果表明,还有 420 420 420 个模数 p p p 满足周期既不等于 p − 1 p-1 p−1 又不等于 2 p + 2 2p+2 2p+2 ,而是它们的某个真因子。

在所有模数里面, p = 9349 p=9349 p=9349 是最特殊的一个了,这时斐波拉契数列模 9349 9349 9349 的周期数列的循环节为

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 1597, 8362, 610, 8972, 233, 9205, 89, 9294, 34, 9328, 13, 9341, 5, 9346, 2, 9348, 1, 0] ,

周期仅为 38 38 38 ,在上述周期里只有 28 28 28 个不同的元素,这是令人十分吃惊的!可以说, 9349 9349 9349 是 10000 10000 10000 以内,斐波拉契数列的幸运数字


四、面向未来的问题

现在我们在此总结出如下五个问题:

问题1 \; 若将范围扩大到模 1 , 000 , 000 1,000,000 1,000,000 以内的素数,那么一共有多少个模数 p p p 满足周期等于 2 p + 2 2p+2 2p+2 ?又有多少个模数 p p p 满足周期等于 p − 1 p-1 p−1 ?此时满足周期等于 2 p + 2 2p+2 2p+2 或 p − 1 p-1 p−1 的占比为多少 ?

问题2 \; 若再将范围扩大到模 100 , 000 , 000 100,000,000 100,000,000 以内的素数,那么一共有多少个模数 p p p 满足周期等于 2 p + 2 2p+2 2p+2 ?又有多少个模数 p p p 满足周期等于 p − 1 p-1 p−1 ?此时满足周期等于 2 p + 2 2p+2 2p+2 或 p − 1 p-1 p−1 的占比为多少 ?

问题3 \; 考虑模小于 N N N 的一切素数,记 C 1 ( N ) C_1(N) C1​(N) 为满足斐波拉契数列模 p p p 的周期等于 2 p + 2 2p+2 2p+2 的素数 p p p 的个数, C 2 ( N ) C_2(N) C2​(N) 为满足模 p p p 的周期等于 p − 1 p-1 p−1 的素数 p p p 的个数,则下述极限是否存在 ?若存在,又为何值 ? lim ⁡ N → + ∞ C 1 ( N ) + C 2 ( N ) π ( N ) \lim_{N \to +\infty} \frac{C_1(N)+C_2(N)}{\pi(N)} N→+∞lim​π(N)C1​(N)+C2​(N)​ 其中 π ( N ) \pi(N) π(N) 表示小于 N N N 的素数个数。

问题4 \; 当范围扩大到模 1 , 000 , 000 1,000,000 1,000,000 以内的素数时,对应斐波拉契数列的幸运数字是多少 ?如果范围进一步扩大到 100 , 000 , 000 100,000,000 100,000,000 时,对应斐波拉契数列的幸运数字又是多少 ?

问题5 \; 如果范围最后扩大到模全体素数时,是否存在斐波拉契数列的幸运数字 ?若存在,该是什么样的素数呢 ?

以上问题 1、2、4 只需要计算机来完成,问题 3、5 需要严格的数学论证。如果你对计算机感兴趣,那么就去完成问题 1、2、4 ;如果你对数论感兴趣,那么就去尝试完成问题 3、5 吧 !

Python 探讨斐波拉契数列模素数的周期问题相关推荐

  1. Pandas 分析斐波那契数列模整数的周期问题

    Pandas 分析斐波那契数列模整数的周期问题 引言 一.改进 Pisano 周期计算 二.计算 Pisano 周期的循环节 三.快速计算任意斐波那契数模 m m m 的余数 四.计算模 100 万以 ...

  2. Python输出斐波拉契数列

    斐波拉契数列 1.什么是斐波拉契数列 2.用Python代码输入数列前30项 遇到问题不要迷茫,多思考,多问,这样你才能越发优秀 1.什么是斐波拉契数列 斐波那契数列(Fibonacci sequen ...

  3. python打印斐波拉契数列

    什么是斐波拉契数列? 斐波那契数列指的是这样一个数列" 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597, ...

  4. python打九九乘法表上三角下三角_python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数......

    CSDN 双十一 活动优惠提前抢!全站好课1元起,万券齐发折上折! 11.11 超值膨胀金[10元抵100元]限量发放!11月11日当天全站通用,更有机会享受折上折优惠!仅限299份,先到先得! 学学 ...

  5. python打九九乘法表上三角下三角_Python-零基础自学系列之九九乘法表、打印菱形、打印对顶三角形、打印闪电、斐波拉契数列、素数...

    刚开学学习简单的练习,学到后面会有越来越多的解法来写! 作业的目的是为了让大家熟悉程序语言,锻炼将思路转换成程序逻辑. 九九乘法表 help(print) 先思考能不能打印出方阵 # 1 方阵 # 1 ...

  6. python打九九乘法表上三角下三角_python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数... - 小黑电脑...

    学学习简单的练习,学到后面会有越来越多的解法来写! 作业的目的是为了让大家熟悉程序语言,锻炼将思路转换成程序逻辑. 九九乘法表 help(print) 先思考能不能打印出方阵 # 1 方阵 # 1 方 ...

  7. 斐波拉契数列python写法

    文章目录 第一种:递推方法 第二种:递归方式 第三种:用一个类写出比较全面的斐波拉契 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonard ...

  8. 【斐波拉契数列】 Python

    [斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和] 题目内容:已知斐波拉契数列的前两项都是1, 我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下:n=int ...

  9. 递归与递推 输出斐波拉契数列的前n项 python

    输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...

最新文章

  1. linux-centos7-yum安装mcrypt**
  2. 最大流 ---- 最大密度子图 ----- 2014-2015 ACM-ICPC, Asia Xian Regional Contest C The Problem Needs 3D Arrays
  3. Python学习之路-装饰器生成器正则表达式
  4. 颜色分类—leetcode75
  5. 聊一聊你了解的程序猿是什么样的?
  6. python的requests库安装失败_robot framework-requests库安装过程问题解决
  7. 【翻译召集令】HenCoder 反向翻译计划
  8. 什么是CDA数据分析师认证考试?
  9. linux安全模块学习之LSM的介绍实现
  10. COMSOL流体操作
  11. 台式计算机硬件组装步骤,【电脑组装教程】DIY台式电脑新手组装+安装系统多图全教程...
  12. MobData活动预告 | 数据智能助力文创产业发展
  13. 小样本学习记录————利用所有数据的元学习Few-shot Text Classification with Distributional Signatures
  14. 8. SpringBoot基础学习笔记
  15. 苹果黑屏就断开无线网连接服务器,跪求苹果手机黑屏以后断开无线网的解决方案!...
  16. 微前端项目实战及原理
  17. 抖音素材哪里下-抖音素材哪里找-短视频素材库
  18. 单片机C语言零基础入门05 - 逻辑运算
  19. 【服务端】多线程游戏服务端
  20. 1.python自动化登录12306

热门文章

  1. 凯斯西储大学轴承故障诊断数据集详解
  2. sht-11c语言程序,基于51单片机SHT11温湿度传感器检测程序(含电路图)
  3. 解决find: paths must precede expression: –name
  4. java客服im_Java IM 即时通讯 | 盘古歌技术 | uni-app 即时通讯 源码出售 chat
  5. thanks!maomao~~
  6. Android 自定义数字虚拟键盘
  7. 【扩频通信】第七章 扩频码同步跟踪
  8. 图书管理系统(c语言)功能比较全
  9. 【乡巴佬】菜鸟收藏:Coreldraw快捷键总集粹
  10. 网页被http://runonce.msn.com/runonce3.aspx锁定