Python 探讨斐波拉契数列模素数的周期问题
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→+∞limFn+1Fn=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 探讨斐波拉契数列模素数的周期问题相关推荐
- Pandas 分析斐波那契数列模整数的周期问题
Pandas 分析斐波那契数列模整数的周期问题 引言 一.改进 Pisano 周期计算 二.计算 Pisano 周期的循环节 三.快速计算任意斐波那契数模 m m m 的余数 四.计算模 100 万以 ...
- Python输出斐波拉契数列
斐波拉契数列 1.什么是斐波拉契数列 2.用Python代码输入数列前30项 遇到问题不要迷茫,多思考,多问,这样你才能越发优秀 1.什么是斐波拉契数列 斐波那契数列(Fibonacci sequen ...
- python打印斐波拉契数列
什么是斐波拉契数列? 斐波那契数列指的是这样一个数列" 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597, ...
- python打九九乘法表上三角下三角_python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数......
CSDN 双十一 活动优惠提前抢!全站好课1元起,万券齐发折上折! 11.11 超值膨胀金[10元抵100元]限量发放!11月11日当天全站通用,更有机会享受折上折优惠!仅限299份,先到先得! 学学 ...
- python打九九乘法表上三角下三角_Python-零基础自学系列之九九乘法表、打印菱形、打印对顶三角形、打印闪电、斐波拉契数列、素数...
刚开学学习简单的练习,学到后面会有越来越多的解法来写! 作业的目的是为了让大家熟悉程序语言,锻炼将思路转换成程序逻辑. 九九乘法表 help(print) 先思考能不能打印出方阵 # 1 方阵 # 1 ...
- python打九九乘法表上三角下三角_python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数... - 小黑电脑...
学学习简单的练习,学到后面会有越来越多的解法来写! 作业的目的是为了让大家熟悉程序语言,锻炼将思路转换成程序逻辑. 九九乘法表 help(print) 先思考能不能打印出方阵 # 1 方阵 # 1 方 ...
- 斐波拉契数列python写法
文章目录 第一种:递推方法 第二种:递归方式 第三种:用一个类写出比较全面的斐波拉契 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonard ...
- 【斐波拉契数列】 Python
[斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和] 题目内容:已知斐波拉契数列的前两项都是1, 我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下:n=int ...
- 递归与递推 输出斐波拉契数列的前n项 python
输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...
最新文章
- linux-centos7-yum安装mcrypt**
- 最大流 ---- 最大密度子图 ----- 2014-2015 ACM-ICPC, Asia Xian Regional Contest C The Problem Needs 3D Arrays
- Python学习之路-装饰器生成器正则表达式
- 颜色分类—leetcode75
- 聊一聊你了解的程序猿是什么样的?
- python的requests库安装失败_robot framework-requests库安装过程问题解决
- 【翻译召集令】HenCoder 反向翻译计划
- 什么是CDA数据分析师认证考试?
- linux安全模块学习之LSM的介绍实现
- COMSOL流体操作
- 台式计算机硬件组装步骤,【电脑组装教程】DIY台式电脑新手组装+安装系统多图全教程...
- MobData活动预告 | 数据智能助力文创产业发展
- 小样本学习记录————利用所有数据的元学习Few-shot Text Classification with Distributional Signatures
- 8. SpringBoot基础学习笔记
- 苹果黑屏就断开无线网连接服务器,跪求苹果手机黑屏以后断开无线网的解决方案!...
- 微前端项目实战及原理
- 抖音素材哪里下-抖音素材哪里找-短视频素材库
- 单片机C语言零基础入门05 - 逻辑运算
- 【服务端】多线程游戏服务端
- 1.python自动化登录12306
热门文章
- 凯斯西储大学轴承故障诊断数据集详解
- sht-11c语言程序,基于51单片机SHT11温湿度传感器检测程序(含电路图)
- 解决find: paths must precede expression: –name
- java客服im_Java IM 即时通讯 | 盘古歌技术 | uni-app 即时通讯 源码出售 chat
- thanks!maomao~~
- Android 自定义数字虚拟键盘
- 【扩频通信】第七章 扩频码同步跟踪
- 图书管理系统(c语言)功能比较全
- 【乡巴佬】菜鸟收藏:Coreldraw快捷键总集粹
- 网页被http://runonce.msn.com/runonce3.aspx锁定