离散对数的求解

1.暴力

2.Baby-step giant-step

3.Pollard’s ρ algorithm

……

下面搬运一下Baby-step giant-step 的做法

这是在 https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/discrete-log/discrete-log/上看到的,比较容易理解。

而且,里面的代码写得简洁明了。

写一下自己理解和自己照着写了一遍

原文代码:

def bsgs(g, y, p):
m = int(ceil(sqrt(p - 1)))
S = {pow(g, j, p): j for j in range(m)} #在字典S中存放了g^j和对应的j
gs = pow(g, p - 1 - m, p) #求解的是baby step中的值,也就是g^(-m),其实就是g^m mod p的逆元,也就可以使用egcd来求解
for i in range(m):
if y in S:
return i * m + S[y] #S[y]取出的是此时y对应的i
y = y * gs % p #如果baby step的值和 giant step的值不相等,继续执行baby step
return None

照着写一遍的代码

#求解离散对数问题

import math
def egcd(a,b):
r0,r1,s0,s1=1,0,0,1
n=b
while(b):
q,a,b=a//b,b,a%b
r0,r1=r1,r0-q*r1
s0,s1=s1,s0-q*s1
return r0%n #拓展欧几里得返回的三个值是,a是a和b的最大公因数,r0和s0分别是ax+by=c中的一组解x和y,【此时只是选择返回一个r0,因为得到的是ax+by=gcd(a,b)中的x即可,有的时候x或者y可能为负数,在求解正数的逆元的时候负数要对n再次求模运算 #求解离散对数就是,X=G^a mod P,其中给出X,G,P的值,要求解的是 a的值,此处采用的是Baby step giant step的方法 def bsgs(x,g,p): #求解x=g^a mod p中的a,其中g是生成元
m=math.ceil(math.sqrt(p-1)) #m的值是 p-1开平方后向上取整
bstep={pow(g,j,p):j for j in range(m)} #每一次 j 的增加表示 “baby-step”,一次乘上g,字典S中存了所有的g^j(j<m)以及其对应的j
gstep=egcd(pow(g,m),p) #算出了gstep的值,也就是g^-m的值
for i in range(m):
if x in bstep:
return i*m+bstep[x]
x=x*gstep%p print(bsgs(37,3,101))

继续学习其他的做法

参考资料:http://zoo.cs.yale.edu/classes/cs257/ppt/all/Mac/19_DiscreteLog.ppt

Discrete Log Algorithms :Baby-step giant-step的更多相关文章

  1. Discrete Log Algorithms :Baby-step giant-step 【二】

    import gmpy2 def discreteLog(g,p,a): #离散对数,求 g^x=a mod p中的x table={} sq=gmpy2.isqrt(p-1) m=gmpy2.add ...

  2. POJ 2417 Discrete Logging ( Baby step giant step )

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3696   Accepted: 1727 ...

  3. 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法

    先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝  扩展Baby Step Gian ...

  4. [置顶] hdu2815 扩展Baby step,Giant step入门

    题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...

  5. HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  6. POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)

    不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...

  7. 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

    什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...

  8. 【POJ2417】baby step giant step

    最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step ...

  9. 『高次同余方程 Baby Step Giant Step算法』

    高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...

随机推荐

  1. Makefile shell subst $(1)

    MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1 ...

  2. jQuery常用插件与jQuery使用validation插件实现表单验证实例

    jQuery常用插件 1,jQuery特别容易扩展,开发者可以基于jQuery开发一些扩展动能 2,插件:http://plugins.jquery.com 3,超厉害的插件:validation . ...

  3. 一条命令,根据进程名判断有进程输出up,无进程无输出

    这个研究了好一会, 由于开发需要,提供的命令. shell命令,可以按照分号分割,也可以按照换行符分割.如果想一行写入多个命令,可以通过“';”分割. a=`ps -ef | grep nginx | ...

  4. Python3.6.2在线安装pymysql模块

    我是一个python新手刚才使用python写邮件发送代码的时候想着需要连接数据库, 下面的安装步骤 python -m pip install pymysql PS C:\Users\hp> ...

  5. windows2012R2标准版升级到数据中心版,不用重装系统

    windows2012R2标准版升级到数据中心版,不用重装系统 Windows Server 2012 R2是微软的服务器系统,是 Windows Server 2012 的升级版本. Windows ...

  6. 【Python57--正则1】

    一.正则表达式匹配IP地址 1.search()方法:用于在字符串中搜索正则表达式模式第一次出现的位置 >>> import re >>> re.search(r' ...

  7. topcoder srm 475 div1

    problem1 link 暴力枚举$r$只兔子的初始位置,然后模拟即可. problem2 link 假设刚生下来的兔子是1岁,那么能够生小兔子的兔子的年龄是至少3岁. 那么所有的兔子按照年龄可以分 ...

  8. topcoder srm 445 div1

    problem1 link 这个的结论是只需要考虑坐标是整数或者是整数.5,比如(2.5,3),(4,3.5),(1.5,4.5)这样的时候.这个详细证明起来应该挺麻烦的.这里有一些讨论. probl ...

  9. 第一次参加acm区域赛

    什么,这周天就要去参加acm焦作赛,简直不敢相信.从大一暑假七月份中旬到今天十一月23日,加入acm将近四个多月的时间,如今到了检验自己的时候了.aaaaaaaaaa.乌拉,必胜.打印个模板,在跑个步 ...

  10. Python3 tkinter基础 Entry insert delete 点击按钮 向输入框赋值 或 清空

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...