信安数学基础 欧拉定理 讨论题

本文探讨了如何使用sagemath和C/C++实现大数运算,包括欧拉定理在简化计算中的作用。举例展示了计算3423748327827483274^(32020) (mod 43857843758454553)和314882150829468584 * 427197303358170108 (mod 2009731336725594113),并阐述了快速乘的原理及其在避免大整数溢出问题上的应用。
摘要由CSDN通过智能技术生成

1. 试用sagemath写一个my_power_mod(a, e, m)函数,计算ae (mod m),其中e, m均为正整数,并用所写的函数计算 3423748327827483274^(32020) (mod 43857843758454553)

def my_power_mod(a,e,m):  # 计算a^e(mod m)
    if gcd(a,m)==1: # 欧拉定理
        e = e%euler_phi(m) # 应用欧拉定理化简后的e
    result = 1
    b = a%m # b的初值
    if(e&1)==1:
        result *= b
    e = e>>1
    while e>0: #迭代过程
        b = b^2%m
        if (e&1)==1:
            result *= b
            result %=m
        e = e>>1
    print(result)

my_power_mod(3423748327827483274,3^2020,43857843758454553)

注:

  • 上述代码先用欧拉定理对e进行化简,然后再运用模重复平方算法求解
  • 事实证明,对于a=3423748327827483274, e=32020, m=43857843758454553 的情况,是否采用欧拉定理对e进行化简不会感受到明显的代码运行时间差异。
  • 但是,倘若e更大些,比如e = 33202020,那么用了欧拉定理的计算速度比不用的时候快很多,差异显著。

运行结果: 42253204095794777

2. 试用C/C++语言计算314882150829468584*427197303358170108(mod 2009731336725594113)

大整数相乘会爆long long,还得写高精度,不划算。如要避免,可使用快速乘。这里呈现O(log)的快速乘算法。
先说原理,考察a*b%m这一表达式,b可以写成 b 0 ∗ 2 0 + b 1 ∗ 2 1 + . . . + b n − 1 ∗ 2 n − 1 b_0*2^0+b_1*2^1+...+b_{n-1}*2^{n-1} b020+b1<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值