• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

-housaihao-

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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\),则

\[a^{\phi(n)}\equiv1\pmod{n} \]

\(\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。

posted on 2023-11-30 17:13  尼古拉斯·铁柱  阅读(13)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3