CINTA作业三:同余、模指数、费尔马小定理、欧拉定理
一、实现求乘法逆元的函数,进而得出求解同余方程的函数
1、乘法逆元:
//实现求乘法逆元的函数
int MultiplicativeInverse(int a, int m)
{
//只讨论a的乘法逆元小于m的情况,且为正整数的情况
for (int i = 0; i < m; i++)
if (i * a % m == 1) return i;
return -1;//如果无解返回-1
}
2、求解同余方程:
//实现求同余方程的解的函数
//需要调用上面的MultiplicativeInverse函数
int CongruenceEquation(int a, int b, int m)
{
if (MultiplicativeInverse(a, m) == -1) return -1;//无解提示
int y = 0;
for (; ((b + m * y) % a); y++)
continue;
return (b + m * y) / a;
}
二、实现模指数运算的函数
//实现模运算的函数
int ModPowerOperation(int x, int y, int m)
{
int bit = 0;//记录y的二进制的数位
long long result = 1;//返回值
for (; y != 0; bit++)
{
if ((y & 1) == 1)//如果y的当前二进制末位为1才执行
result *= ((long long)pow((int)2, (int)bit)) % m;
y >>= 1;//y右移一位,相当于整除2
}
return result;
}
三、费马小定理的计算
设p=23和a=5,使用费马小定理计算a^{2020} mod p
解:
由p=23的p-1=22
且2020 mod 22 = 18
则5 ^ {2020} mod 23 = 5 ^ {18} mod 23
利用模指数运算:
18 ToBinary is 10010
且5 ^ {16} mod 23 = 3
5 ^ {2} mod 23 = 2
则 5 ^ {2020} mod 23 = (2 * 3) mod 23 = 6
四、欧拉定理的计算
利用欧拉定理计算2 ^ {10000} mod 55
解:
利用欧拉Phi函数知道:55的欧拉函数值:40
利用欧拉定理知道:2 ^ {40} mod 55 = 1
且100000 mod 40 = 0
因此 2 ^ {10000} mod 55 = 1
五、欧拉定理计算的拓展
手动计算 7 ^ {1000} 最后两个数位是什么?
这一道题第一种方法是找规律
第二种方法是取最后两位数其实就是对一百取余,因此可以利用欧拉函数
具体解法看图片