CINTA第二次作业
7.手动计算以下模m下a的乘法逆元。(a)m=11,a=5 (b)m=121,a=13
( c)m=1021,a=131
(a)
[
1
0
11
0
1
5
]
\begin{bmatrix} 1 & 0 & 11 \\ 0 & 1 & 5 \end{bmatrix}
[1001115]
[
0
1
5
1
−
2
1
]
\begin{bmatrix} 0 & 1 & 5 \\ 1 & -2 & 1 \end{bmatrix}
[011−251]
所以a的乘法逆元是-2
(b)
[
1
0
121
0
1
13
]
\begin{bmatrix} 1 & 0 & 121 \\ 0 & 1 & 13 \end{bmatrix}
[100112113]
[
0
1
13
1
−
9
4
]
\begin{bmatrix} 0 & 1 & 13 \\ 1 & -9 & 4 \end{bmatrix}
[011−9134]
[
1
−
9
4
−
3
28
1
]
\begin{bmatrix} 1 & -9 & 4 \\ -3 & 28 & 1 \end{bmatrix}
[1−3−92841]
所以a的乘法逆元为28
(c)
[
1
0
1021
0
1
131
]
\begin{bmatrix} 1 & 0 & 1021 \\ 0 & 1 & 131 \end{bmatrix}
[10011021131]
[
0
1
131
1
−
8
−
27
]
\begin{bmatrix} 0 & 1 & 131 \\ 1 & -8 & -27 \end{bmatrix}
[011−8131−27]
[
1
−
8
−
27
5
−
39
−
4
]
\begin{bmatrix} 1 & -8 & -27 \\ 5 & -39 & -4 \end{bmatrix}
[15−8−39−27−4]
[
5
−
39
−
4
−
34
265
1
]
\begin{bmatrix} 5 & -39 & -4 \\ -34 & 265 & 1 \end{bmatrix}
[5−34−39265−41]
所以a的乘法逆元为265
8.编写c语言程序完成模指数运算,即给定整数x,y和m为输入,计算并返回xymod m
将模指数进行分治计算
#include <iostream>
#include<cmath>
using namespace std;
int ME(int x,int y,int m)
{
int res=1;
while(y)
{
if(y&1)
res=(res*x)%m;
y>>=1;
x=x*x%m;
}
return res;
}
9.
这是对矩阵的快速幂运算
#include<iostream>
using namespace std;
struct matrix{
int a[2][2];
};
matrix multip(matrix a1,matrix a2)
{
matrix temp;//中间变量,存储
temp.a[0][0]=temp.a[1][0]=temp.a[0][1]=temp.a[1][1]=0;
for(int i=1; i<=2; i++)
for(int j=1; j<=2; j++)
for(int k=1; k<=2; k++)
{ //第i行乘以第j列的和
temp.a[i][j]=temp.a[i][j]+a1.a[i][k]*a2.a[k][j];
}
return temp;
}
matrix qpow(int n,matrix a1)
{
//传入n次幂
matrix a2;
while(n)
{
if(n&1)
a2=multip(a2,a1);//n为奇数
a1=multip(a1,a1);
n>>=1;// n/=2
}
return a2;
}
运用反证法
假设给定互素的正整数c和m,存在整数值c-1不模m唯一
设a,b分别为c模m的逆元,ac≡bc≡1(mod m)
由定理得:m | c(a - b), 又因为 gcd(c, m) = 1, 所以 m | (a - b),即 a≡b(mod m)
说明a,b模m唯一,与假设矛盾
命题得证
11.编写一个 Python 程序计算乘法逆元,即输入互素的正整数 c 和 m,返回 c ,使得 cc−1 ≡ (mod m)。要求:只返回为正整数的 c−1。
ddef ex_gcd(a, b): #扩展欧几里得算法
if b == 0:
return 1, 0, a
else:
x, y, gcd = ex_gcd(b, a % b) #需多递归一层用于判断
x, y = y, (x - (a // b) * y)
return x, y, gcd