形如a^b(mod p)=d且p为质数的方程之解

今年没在打ctf了,但是听说又出了这种题(??)
总之姑且总结一下目前碰到过的这几种,给自己存个档。
什么你说数学原理?不存在的,我又不是ACMer(此时一名搬砖民工抓起代码就是一个调用(不

已知a b p,求d

一般情况下快速幂和快速乘比较保险,不过python可以直接pow(),只写快速幂也行,int任意精度是好文明(你看隔壁c++的long long又爆了(小声嘀咕
但是这里有个问题在于pow()的计算精度……想不太明白是怎么回事orz
具体体现可以看安恒2018年7月赛-Crypto-dangerous rsa这道题,到最后也没能解决,跪了()

def mul(a,b,p):
  r=0
  t=a
  while(b):
    if(b&1):
      r=(r+t)%p
    t=(t<<1)%p
    b>>=1
  return r

def fast_pow(a,b,p):
    r=1
    t=a
    while(b):
        if(b&1):
          r=mul(r,t,p)%p
        t=mul(t,t,p)%p
        b>>=1
    return r

print(fast_pow(2,3,5))

题外话,快速幂有两种实现方式(递归和循环),此处采用循环,参考https://www.cnblogs.com/chengd/articles/7103854.html

递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

终于解答了去年给RSA写快速幂取模函数的时候出现的问题x唐突爆栈猝不及防(……)总之学到了写算法的时候要根据实际情况权衡时间复杂度和空间复杂度,通常情况下递归的时间复杂度比非递归的大很多,不能因为图好写就盲目递归(。
也反思了一下自己,学过数据结构我应该知道递归会爆栈才对啊为什么自己敲的时候根本没想到(……)此时一名辣鸡路过

已知a d p,求b

去年hgame第一周的题,题目名直接就是提示了,就算这样也折腾了好久,不玩ACM真吃亏,还很丢人()
BSGS代码(原网址已挂):
https://pythonexample.com/snippet/bsgspy_0xtowel_python

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Towel 2017
from math import ceil, sqrt
def bsgs(g, h, p):
    '''
    Solve for x in h = g^x mod p given a prime p.
    If p is not prime, you shouldn't use BSGS anyway.
    '''
    N = ceil(sqrt(p - 1)) # phi(p) is p-1 if p is prime
    # Store hashmap of g^{1...m} (mod p). Baby step.
    tbl = {pow(g, i, p):i for i in range(N)}
    # Precompute via Fermat's Little Theorem
    c = pow(g, N * (p - 2), p)
    # Search for an equivalence in the table. Giant step.
    for j in range(N):
        y = (h % p * pow(c, j, p)) % p
        if y in tbl:
            a = j * N + tbl[y]
            print(a)
#            return j * N + tbl[y]
    # Solution not found
    return a
#print(bsgs(73300775185, 527242847469, 650260984909))

题外话*2,扩展BSGS可以针对p不是质数的情况,这两个算法的具体原理可以参考:
https://blog.csdn.net/lycheng1215/article/details/79047734
附了c++的BSGSex代码,十分贴心()
以及:
https://blog.csdn.net/a27038/article/details/77341735
从原理到步骤到代码到应用都很详细,同样有附代码,强烈推荐。

已知b d p,求a

是朋友前几天问我的题,我看到也是直接去世(……)
然后搜到了这篇,啊是大佬,我死了(
https://blog.csdn.net/acdreamers/article/details/9500215

过几天要是想起来了就补一下python版的代码。

扩展阅读&实际应用


  • Python教程 - 递归函数 - 廖雪峰
  • 【详解】快速幂&龟速乘&快速乘 - Cyan_rose
  • FZU - 1759- Super A^B mod C
  • HDU - 5187 - zhx's contest

  • Baby-step giant-step - Wikipedia
  • Pohlig–Hellman algorithm - Wikipedia
  • POJ - 2417 - Discrete Logging

  • 一些数论概念与算法——从SGU261谈起 - 雪琼 - 博客园
  • SGU - 261 - Discrete Roots
  • HDU - 3930 - Broot

你可能感兴趣的:(形如a^b(mod p)=d且p为质数的方程之解)