如何向该算法的s部分添加打印函数以打印出所有已进行的迭代?

2024-06-28 11:05:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在中间算法中研究一个部分;也称为“碰撞算法”。这是密码

Python 3 Program To Calculate The Discrete Logarithm Problem Using The Collision Algorithm

import math; 
  
def discreteLogarithm(a, b, m):  
  
    n = int(math.sqrt (m) + 1); 
  
    # Calculate a ^ n  
    an = 1; 
    for i in range(n): 
        an = (an * a) % m; 
  
    value = [0] * m; 
  
    # Store all values of a^(n*i) of LHS 
    cur = an; 
    for i in range(1, n + 1): 
        if (value[ cur ] == 0): 
            value[ cur ] = i; 
        cur = (cur * an) % m; 
      
    cur = b; 
    for i in range(n + 1): 
          
        # Calculate (a ^ j) * b and check 
        # for collision 
        if (value[cur] > 0): 
            ans = value[cur] * n - i; 
            if (ans < m): 
                return ans; 
        cur = (cur * a) % m; 
  
    return -1; 
  
# Driver code 
a = 2;
 
b = 3;
 
m = 5; 

print(discreteLogarithm(a, b, m)); 
  
# This code is contributed by mits.

考虑到这段代码,我实际上遇到了一个问题

我的意图是将这段代码分成几个部分,分别应用它们。在下面代码的这一部分中,我试图应用某种打印函数来打印已存储的所有迭代,但我并没有完全正确

# Store all values of a^(n*i) of LHS 
    cur = an; 
    for i in range(1, n + 1): 
        if (value[ cur ] == 0): 
            value[ cur ] = i; 
        cur = (cur * an) % m;

Tags: ofthe代码in算法anforif
1条回答
网友
1楼 · 发布于 2024-06-28 11:05:00

您正在寻找print()函数吗?下面是一个带有一些打印输出的代码示例。请注意,在代码的某些行末尾有不必要的分号。我把它们拿走了

import math


def discreteLogarithm(a, b, m):

    _n = int(math.sqrt(m) + 1)
    print(f"_n = {_n}")

    # Calculate a ^ n
    print("### Calculate a ^ n")
    an = 1
    for i in range(_n):
        an = (an * a) % m
        print(f"an = {an}")

    value = [0] * m

    # Store all values of a^(n*i) of LHS
    print("### Store all values of a^(n*i) of LHS")
    cur = an
    for i in range(1, _n + 1):
        if (value[cur] == 0):
            value[cur] = i
        cur = (cur * an) % m
        print(f"cur1 = {cur}")

    cur = b

    # Calculate (a ^ j) * b and check for collision
    print("### Calculate (a ^ j) * b and check for collision")
    for i in range(_n + 1):
        if (value[cur] > 0):
            ans = value[cur] * _n - i
            print(f"ans = {ans}")
            if (ans < m):
                return ans
        cur = (cur * a) % m
        print(f"cur = {cur}")

    return -1


if __name__ == "__main__":

    # Driver code
    a = 2
    b = 3
    m = 5
    ans = discreteLogarithm(a, b, m)
    print(f"### discreteLogarithm({a}, {b}, {m})")
    print(f"ans = {ans}")

    # This code is contributed by mits.

相关问题 更多 >