CINTA作业二
第三章
1、模指数运算函数
要求: 写一个模指数运算函数Mod_Exp,输入a、b和m,输出a^b mod m,即a的b次方模m。
递归版本:
C++代码如下:
//递归版本
int Mod_Exp(int a, int b, int m)
{
if (b == 0)
return 1;
int temp = Mod_Exp(a, b / 2, m);
if (b % 2 == 0)
return (temp * temp) % m;
else if (b % 2 == 1)
return (a * temp * temp) % m;
}
迭代版本:
C++代码如下:
//迭代版本
int Mod_Exp_1(int a, int b, int m)
{
int res = 1;
while (b != 0)
{
if (b & 1)
res = (res * a) % m;
b = b >> 1;
a = (a * a) % m;
}
return res;
}
2、求乘法逆元函数
要求:写一个求乘法逆元的函数Mul_Inverse,输入a和m,求a模m的乘法逆元。提示,要求只输出正整数。
首先,a模m的乘法逆元存在当且仅当\(\gcd(a,m)=1\),然后我们求乘法逆元的思路主要是利用扩展欧几里得算法(egcd算法)。
C++代码如下:
int Mul_Inverse(int a, int m)
{
int temp, tempx, tempy;
int tempm = m;
int r0 = 1, s0 = 0, r1 = 0, s1 = 1;
RS rs;
while (m)
{
int p = a / m;
temp = m;
m = a % m;
a = temp;
int tempr0 = r0, temps0 = s0;
r0 = r1, s0 = s1;
r1 = tempr0 - p * r1;
s1 = temps0 - p * s1;
}
rs.r = r0, rs.s = s0, rs.d = a;
while (rs.r < 0)
rs.r += tempm;//若逆元<0,则再求出大于0的乘法逆元
if (rs.d == 1)//a,m互素
return rs.r;
else
return -1;//乘法逆元不存在
}
第四章
第一题
题目:设 p = 23 和 a = 3,使用费尔马小定理计算 \(a^{2019}\bmod p\)?
解:\(a^{2019}\bmod p=3^{2019}\bmod23=3^{91*22+17}\bmod23\)
\(91*22=91*(23-1)\),根据费尔马小定理可得\(3^{23-1}\equiv1\pmod{23}\),所以\(3^{91*22+17}\bmod23=3^{17}\bmod23=16\)
第五题
题目:请证明 13 整除 \(2^{70}+3^{70}\)。[提示:这是一道名为证明题的计算题。]
解:证明 13 整除 \(2^{70}+3^{70}\)即证明\((2^{70}+3^{70})\bmod13=0\)
\((2^{70}+3^{70})\bmod13\)
\(=(2^{70}\bmod13+3^{70}\bmod13)\bmod13\)
\(=(2^{12*5+10}\bmod13+3^{12*5+10}\bmod13)\bmod13\)
根据费尔马小定理可得:\(2^{13-1}\equiv1\pmod{13}\),\(3^{13-1}\equiv1\pmod{13}\)
所以:\((2^{12*5+10}\bmod13+3^{12*5+10}\bmod13)\bmod13\)
\(=(2^{10}\bmod13+3^{10}\bmod13)\bmod13\)
\(=(10+3)\bmod13=0\),题目得证。
第六题
题目:使用欧拉定理计算 \(2^{100000}\bmod55\)。
解:欧拉定理:
设 \(n\) 和 \(a\)为正整数,且\(\gcd(a,n)=1\),则
\(\gcd(2,55)=1\)可得\(2^{\phi(55)}\equiv1\bmod55\)
又由欧拉\(phi\)函数公式可得\(\phi(55)=\phi(5)*\phi(11)=4*10=40\)
即\(2^{40}\bmod55=1\)
所以\(2^{100000}\bmod55\)
\(=2^{100000}\bmod55\)
\(=2^{40*2500}\bmod55\)
\(=(2^{40}\bmod55)^{2500}\bmod55\)
\(=1\bmod55=1\)
第八题
题目:手动计算\(7^{1000}\) 的最后两个数位等于什么?
解:题目即计算\(7^{1000}\bmod100\)的值,与上一题相同由欧拉定理可得
\(7^{\phi(100)}\equiv1\bmod100\)
\(\phi(100)=40\)所以\(7^{40}\bmod100=1\)
所以\(7^{1000}\bmod100\)
\(=7^{40*25}\bmod100\)
\(=(7^{40}\bmod100)^{25}\bmod100\)
\(=1\bmod100=1\)
所以最后两个数子是0和1。