Montgomery模幂(Square_and _multiply)算法与binary模幂算法的python实现

本文介绍了Montgomery模幂算法和二进制模幂函数的Python实现,通过实例展示了在大素数n下计算效率,并对比了两种方法的执行时间。
摘要由CSDN通过智能技术生成
import time
# 计算x除以2的k次幂函数
def mod_2_k(x, k):
    result = x & ((1 << k) - 1)
    return result
# Montgomery 模幂函数
def montgomery_power(base, exponent, n, k):
    result = 1
    while exponent > 0:
        if exponent % 2 == 1:
            result = montgomery_multiply(result, base, n, k) % n
        exponent >>= 1
        base = montgomery_multiply(base, base, n, k) % n
    return result


# Montgomery 乘法函数
def montgomery_multiply(a, b, n, k):
    r = 2 ** k
    a_bar = a * r % n
    b_bar = b * r % n
    n_bar = -pow(n, -1, r) % r
    r_bar = pow(r, -1, n)
    c = (a_bar * b_bar + mod_2_k(a_bar * b_bar * n_bar, k) * n) >> k
    if c >= n:
        c = c - n
    return c * r_bar % n
# binary 模幂函数
def binary_power(base, exponent, modulus):
    """
    二进制模幂
    """
    result = 1
    base = base % modulus
    while exponent > 0:
        if exponent % 2 == 1:
            result = (result * base) % modulus
        exponent >>= 1
        base = (base * base) % modulus
    return result
# 测试结果,注意n为大素数且2 ** k > n
a = 154
b = 4589412432456775214
n = 123456791153132159454121
k = 20
start_time = time.perf_counter()
result_montgomery = montgomery_power(a, b, n, k)
end_time = time.perf_counter()
execution_time = end_time - start_time
print("montgomery result: ", result_montgomery)
print("using time: ", execution_time)
start_time = time.perf_counter()
result_binary = binary_power(a, b, n)
end_time = time.perf_counter()
execution_time = end_time - start_time
print("binary result: ", result_binary)
print("using time: ", execution_time)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值