CINTA作业3

1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。

int inverse(int a,int m){//求乘法逆元
	int i,j,s;
	for(i=1;i<m;i++){
		j=1;
		while(a*i-m*j>0){
			if(a*i-m*j==1){
				s=i;
				goto end;
			}
			j++;
		}
	}
	end:
	if(i==m){
		cout<<"无解!"<<endl;
		return 0;
	}
	else return s;
}

int slove(int a,int b,int m){//求同余方程的解
	int s=inverse(a,m);
	if(s==0){
		cout<<"无解!"<<endl;
		return 0;
	}
	else{
		return b*s%m;
	}
}

2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。

int mod_exp(int x,int y,int m){
	int tmp=x%m,res=1;
	while(y>0){
		if(y%2==1){
			res*=tmp;
			cout<<"res = "<<res<<endl;
		}
		tmp*=tmp;
		tmp%=m;
		y>>=1;
	}
	return res%m;
}

3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?

p 是素数,所以可以由费尔马小定理得 a 22 ≡ 1 m o d 23 a ^ {22} ≡ 1 mod 23 a221mod23
原式:

a 2020 m o d 23 a ^ {2020} mod 23 a2020mod23

= a 22 ∗ 91 + 18 m o d 23 = a ^ {22 * 91 + 18} mod 23 =a2291+18mod23

= a 22 ∗ 91 ∗ a 18 m o d 23 = a ^ {22 * 91} * a ^ {18} mod23 =a2291a18mod23

= a 18 m o d 23 = a ^ {18} mod 23 =a18mod23

= 5 18 m o d 23 = 5 ^ {18} mod 23 =518mod23

= 6 = 6 =6

4、使用欧拉定理计算2^{100000} mod 55。

ϕ ( 55 ) = 40 ϕ(55) = 40 ϕ(55)=40

由于 g c d ( 2 , 55 ) = 1 gcd(2,55) = 1 gcd(2,55)=1,所以可以由欧拉定理得 2 ∗ ϕ ∗ ( 55 ) ≡ 1 m o d 55 2 ^ {*ϕ*(55)} ≡ 1 mod 55 2ϕ(55)1mod55
原式:

2 100000 m o d 55 2 ^ {100000} mod 55 2100000mod55

= 2 40 ∗ 2500 m o d 55 = 2 ^ {40*2500} mod 55 =2402500mod55

= 1 m o d 55 = 1 mod 55 =1mod55

= 1 = 1 =1

5、手动计算7^{1000}的最后两个数位等于什么?

只看十位数和个位数:

7 1 = 07 7 ^ {1} = 07 71=07

7 2 = 49 7 ^ {2} = 49 72=49

7 3 = 43 7 ^ {3} = 43 73=43

7 4 = 01 7 ^ {4} = 01 74=01

7 5 = 07 7 ^ {5} = 07 75=07

每4次方,十位数和个位数就循环一次

1000 / 4 = 250 1000 / 4 = 250 1000/4=250

所以 7 1000 7 ^ {1000} 71000 的十位数和个位数分别是 0,1

Supongo que te gusta

Origin blog.csdn.net/weixin_51280668/article/details/120731904
Recomendado
Clasificación