RSA数学基础 连分数

前言

最近在学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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值