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} b0∗20+b1<