前言
最近在学rsa,补一下连分数
定义
形如
a
0
+
1
a
1
+
1
a
2
+
1
a
3
+
1
…
a_{0}+\frac{1}{a_{1}+\frac{1}{a_{2}+\frac{1}{a_{3}+\frac{1}{\ldots}}}}
a0+a1+a2+a3+…1111
的分数
连分数分为有限连分数无限连分数
如上是一个无限连分数
任何一个有理数都可以表示为有限连分数
任何一个无理数都可以表示为无限连分数
简洁表达
[
a
0
,
a
1
,
a
2
,
a
3
,
a
4
⋯
]
\left[\mathrm{a}_{0}, \mathrm{a}_{1}, \mathrm{a}_{2}, \mathrm{a}_{3}, \mathrm{a}_{4} \cdots\right]
[a0,a1,a2,a3,a4⋯]
python实现
以下脚本来自NSSCTF平台的Xenny师傅
分数转连分数
def continuedFra(x, y):
cF = []
while y:
cF += [x // y]
x, y = y, x % y
return cF
连分数转分数
def Simplify(ctnf):
numerator = 0
denominator = 1
for x in ctnf[::-1]:
numerator, denominator = denominator, x * denominator + numerator
return (numerator, denominator)
我感觉这里的numerator和denominator变量声明反了(只是命名问题)
以下是Lazzaro师傅的脚本
def continued_fraction(sub_res):
numerator,denominator=1,0
for i in sub_res[::-1]: #从sublist的后面往前循环
denominator,numerator=numerator,i*numerator+denominator
return denominator,numerator #得到渐进分数的分母和分子,并返回
求渐进分数
这是Lazzaro师傅的
def sub_fraction(x,y):
res=continuedFra(x,y)
res=list(map(Simplify,(res[0:i] for i in range(1,len(res))))) #将连分数的结果逐一截取以求渐进分数
return res
这是Xenny师傅的
def getit(c):
cf = []
for i in range(1, len(c)):
cf.append(Simplify(c[:i]))
return cf