作业2
7.手动计算以下模m下a的乘法逆元。(a)m=11,a=5;(b)m=121,a=13;©m=1021,a=131。
利用扩展欧几里得算法求乘法逆元
(a) m=11,a=5
解:
[
1
0
11
0
1
5
]
(1)
\left[ \begin{matrix} 1 & 0 & 11 \\ 0 & 1 & 5 \\ \end{matrix} \right] \tag{1}
[1001115](1)
用第一行减两倍第二行,得到一个新的行,接着把第一行替换为第二行,新的一行替换原来的第二行,得到一个新的矩阵
[
0
1
5
1
−
2
1
]
(2)
\left[ \begin{matrix} 0 & 1 & 5 \\ 1 & -2 & 1 \\ \end{matrix} \right] \tag{2}
[011−251](2)
得到r=-2,s=3和d=1。
m+r=9,所以求得乘法逆元为9
同样的方式,计算以下
(b)m=121,a=13
[
1
0
121
0
1
13
]
(1)
\left[ \begin{matrix} 1 & 0 & 121 \\ 0 & 1 & 13 \\ \end{matrix} \right] \tag{1}
[100112113](1)
[
0
1
13
1
−
9
4
]
(2)
\left[ \begin{matrix} 0 & 1 & 13 \\ 1 & -9 & 4 \\ \end{matrix} \right] \tag{2}
[011−9134](2)
[
1
−
9
4
0
28
1
]
(3)
\left[ \begin{matrix} 1 & -9 & 4 \\ 0 & 28 & 1 \\ \end{matrix} \right] \tag{3}
[10−92841](3)
解得乘法逆元为28
©m=1021,a=131
[
1
0
1021
0
1
131
]
(1)
\left[ \begin{matrix} 1 & 0 & 1021 \\ 0 & 1 & 131 \\ \end{matrix} \right] \tag{1}
[10011021131](1)
[
0
1
131
1
−
7
104
]
(2)
\left[ \begin{matrix} 0 & 1 & 131 \\ 1 & -7 & 104 \\ \end{matrix} \right] \tag{2}
[011−7131104](2)
[
1
−
7
104
−
1
8
27
]
(3)
\left[ \begin{matrix} 1 & -7 & 104 \\ -1 & 8 & 27 \\ \end{matrix} \right] \tag{3}
[1−1−7810427](3)
[
−
1
8
27
4
−
31
23
]
(4)
\left[ \begin{matrix} -1 & 8 & 27 \\ 4 & -31 & 23 \\ \end{matrix} \right] \tag{4}
[−148−312723](4)
[
4
−
31
23
−
5
39
4
]
(5)
\left[ \begin{matrix} 4& -31& 23 \\ -5 & 39 & 4 \\ \end{matrix} \right] \tag{5}
[4−5−3139234](5)
[
−
5
39
4
29
−
226
3
]
(6)
\left[ \begin{matrix} -5& 39 & 4 \\ 29 & -226 & 3 \\ \end{matrix} \right] \tag{6}
[−52939−22643](6)
[
29
−
226
3
−
34
265
1
]
(7)
\left[ \begin{matrix} 29 & -226 & 3 \\ -34 & 265 & 1 \\ \end{matrix} \right] \tag{7}
[29−34−22626531](7)
所以乘法逆元为265
8.编写C语言程序完成模指数运算,即给定整数x,y,和m为输入,计算并返回值xy mod m。
#include <iostream>
using namespace std;
int modezs(int x, int y, int n)
{
if (y == 0) return 1;
int z = modezs(x, y / 2, n);
if (y % 2 == 0) return z * z % n;
else return x * z * z % n;
}
int main()
{
int x, y, n;
int z;
cin >> x >> y >> n;
z = modezs(x, y, n);
cout << z << endl;
return 0;
}
运行结果测试:
由题意,只需构造一个 [ 1 1 1 0 ] \left[ \begin{matrix} 1 & 1 \\ 1 & 0 \\ \end{matrix} \right] \ [1110] 矩阵,然后求其的n次幂就可以快速求解F(n)
#include<iostream>
using namespace std;
class Matrix {
public:
int m[2][2];
Matrix() {
m[0][0] = m[0][1] = m[1][0] = 1;
m[1][1] = 0;
}
Matrix(int a,int b,int c,int d) {
m[0][0] = a; m[0][1] = b; m[1][0] = c;
m[1][1] = d;
}
};
Matrix multiply(Matrix a, Matrix b) {//矩阵乘法
Matrix c;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
c.m[i][j] = a.m[i][0] * b.m[0][j] + a.m[i][1] * b.m[1][j];
}
}
return c;
}
Matrix pow(Matrix a, int n) {//快速幂
Matrix ret(1,0,0,1);//构造单位矩阵
while (n > 0) {
if (n & 1) {
ret = multiply(ret, a);
}
n >>= 1;
a = multiply(a, a);
}
return ret;
}
int fib(int n) {
if (n < 2) {
return n;
}
Matrix q;
Matrix res = pow(q, n - 1);
return res.m[0][0];
}
int main()
{
int n;
cin >> n;
cout << "F"<<"("<<n<<")=" << fib(n);
}
结果测试:
10.给定互素的正整数c和m,请证明在mod m的意义上存在唯一确定的整数值c-1,它使得cc^-1≡(mod m)。
证明:
∵两个正整数c和m
∴由Bézout 定理,存在整数 r 和 s 使得:
gcd(c, m) = cr + ms=1
即cr+ms≡1(mod m)
即cr≡1(mod m))
∴存在c-1=r使得cc^-1≡1(mod m)。
假设c mod m的逆元不是唯一的,设a、b分别c mod m的逆元,则ac≡bc≡1(mod m)
由定义则有m|c(a-b)
∵gcd(c,m)=1
∴m|(a-b)
即a≡c(mod m)
∴a和c是模m唯一的,假设不成立。
综上,在mod m的意义上存在唯一确定的整数值c-1,它使得cc^-1≡(mod m)