同余方程

形如 \(ax \equiv b \pmod n\) 的式子称为线性同余方程。对于这样的式子有解的充要条件是 \(gcd(a,n) \mid b\) .

于是扩展gcd求解
将原方程化为一次不定方程 \(ax+ny = b\) .
利用扩展欧几里得算法求解不定方程 $ ax + ny = b$ 的整数解的求解全过程,步骤如下:

1、先计算 \(gcd(a,n)\),若 \(b\) 不能被 \(gcd(a,n)\) 整除,则方程无整数解;否则,在方程右边除以 \(b/gcd(a,n)\),记 得到新的不定方程 \(ax_0 + ny_0 = gcd(a,n)\).

2、利用扩展欧几里德算法求出方程 $ax_0 + ny_0 = gcd(a, b) $的一组整数解 \(x_0\) , \(y_0\);

3、根据数论中的相关定理,记 \(k=b/gcd(a,n)\),可得方程 \(ax + ny = b\) 的所有整数解为:

\[ x = k*x_0 + n/gcd(a,n)* t \\ y =k* y_0 –a/gcd(a,n)* t \\ (t=0,1,2,……)\]
调整得到关于 \(x\) 的正整数解
注意因为解有多个,而我们要求最优解(正整数中最小的),所以 \((x+=n/gcd(a,n)\%(n/gcd(a,n))\);
加法是为了保证正数,取模是为了最小

青蛙的约会

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
long long  init(){long long  rv=0,fh=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') fh=-1;c=getchar();}while(c>='0'&&c<='9'){rv=(rv<<1)+(rv<<3)+c-'0';c=getchar();}return fh*rv;
}
long long x,y,m,n,l;
long long exgcd(long long a,long long b,long long &x,long long &y){if(b==0){x=1;y=0;return a;}long long  t=exgcd(b,a%b,y,x);y-=(a/b)*x;return t;
}
int main(){freopen("in.txt","r",stdin);x=init();y=init();m=init();n=init();l=init();   if(m - n< 0) swap(m, n), swap(x, y);long long  a=0,b=0;long long  t=exgcd(m-n,l,a,b);if(n==m||(x-y)%t!=0){printf("Impossible");return 0;}(a*=(y-x)/t)%=(l/t);(a+=l)%=(l/t);//以保证最优解cout<<a;fclose(stdin);return 0;
}

exgcd可以用来求逆元

\(ax \equiv 1 \pmod n\) 已知 \(a\) , \(n\) 求 \(x\)
因为 \(n\) 是个素数,所以 \(gcd(a,n)==1\) ;
原方程可化为 \(ax \equiv gcd(a,n) \pmod n\)
用exgcd求解即可。

同余方程组

\(x\%p_1 = b_1\)
\(x\%p_2 = b_2\)
\(x\%p_3 = b_3\)
\(x\%p_4 = b_4\)
求 \(x\) 的最小正整数解
小范围数据直接枚举

对于模数互质的情况,使用中国剩余定理(CRT)
令 \(m=p_1p_2p_3 \ldots p_n\)
构造出
//定义 \(ni(k,p)\) 是 \(k\) 在模 \(p\) 意义下逆元
\[x = (m/p_1*ni(m/p_1, p_1)*a1 + \ldots) \% m\]
CRT求解同余方程组

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
long long a1,a2,a3,a4,b1,b2,b3,b4;
long long m;
long long exgcd(long long a,long long b,long long &x,long long &y){if(!b){x=1;y=0;return a;}long long t=exgcd(b,a%b,y,x);y-=a/b*x;return t;
}
long long ni(long long a,long long b){long long x=0,y=0;long long t=exgcd(a,b,x,y);if(t!=1) return -1;else return((x+b)%b);
}
int main(){freopen("in.txt","r",stdin);cin>>a1>>b1>>a2>>b2>>a3>>b3>>a4>>b4;m=a1*a2*a3*a4;cout<<(m/a1*ni(m/a1,a1)*b1+m/a2*ni(m/a2,a2)*b2+m/a3*ni(m/a3,a3)*b3+m/a4*ni(m/a4,a4)*b4)%m;fclose(stdin);return 0;
}

对于一般情况采用exgcd两两合并,
\(x+a_1k_1=b_1\)
\(x+k_2a_2=b_2\)
\(a_1k_1-k_2a_2=b_1-b_2\)
$t=exgcd(a_1,-a_2,k_1,k_2) $ 实际上 \(-a_2\) 可以写作 \(a_2\)
合并:
\(k_1=(k_1*(b_1-b_2)/t)\%a2\); //此处是模 \(a_2\) ,因为可以看成是模 \(a_2\)意义下的同余方程
\(b_1-=a_1*k_1\) // \(b_1\) 就是原式中的 \(x\)
\(a_1=a_1/t*a_2\) //把 $ a_1\(变成\)lcm(a1,a2)$
\(b_1\%=a_1\) //把 \(b_1\) 调整至新式子的B
此时就把两个式子合并为了一个,待所有的都合并完后,结果就是 \(b_1\) 调整好的最小正整数 \((b_1+=a_1)\%=a_1\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#define LL long long
using namespace std;
LL init(){LL rv=0,fh=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') fh=-1;c=getchar();}while(c>='0'&&c<='9'){rv=(rv<<1)+(rv<<3)+c-'0';c=getchar();}return rv*fh;
}
LL a,b,a1,b1;
LL exgcd(LL a,LL b,LL &x,LL &y){if(!b){x=1;y=0;return a;}LL t=exgcd(b,a%b,y,x);y-=a/b*x;return t;
}
int main(){freopen("in.txt","r",stdin);a=init();b=init();for(int i=1;i<=3;i++){a1=init();b1=init();LL x=0,y=0;LL t=exgcd(a,a1,x,y);x=(x*(b-b1)/t)%a1;b-=a*x;a=a/t*a1;b%=a;}(b+=a)%=a;cout<<b;fclose(stdin);return 0;
}

求逆元

\(ax \equiv 1 \pmod n\)
逆元存在的充要条件是\(gcd(a,n)==1\);
一般采用exgcd求逆元,若p是质数,也可使用费马小定理,快速幂
模质数 \(P\) 意义下

从\(1! \sim n!\)

先用快速幂处理出 \(n!^{-1}\),并预处理出来,\(1! \sim n!\),那么
\[n^{-1} = n!^{-1} * (n - 1)!\]
\[(n-1)!^{-1} = n!^{-1} * n\]
由此递推即可

从 $1 \sim n $

此方法不需要求阶乘,代码简单
首先 \(1^{-1} = 1\pmod p\)
设 $p = k * i + r $, \(1 < i < p, r < i\)
所以 \(k * i + r \equiv 0 \pmod p\)
所有两边同乘以 \(i^{-1}*r^{-1}\)得
\[k * r^{-1} + i^{-1} \equiv 0 \pmod p\\ i^{-1} \equiv -k * r^{-1} \pmod p\\ i^{-1} \equiv -\lfloor p/r \rfloor * ( p\mod i)^{-1} \]

N[i] = (p -p / i) * N[p % i] %p;

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7868283.html

数论相关:同余方程与同余方程组的解法相关推荐

  1. 三元一次方程组计算机解法,math 三元一次方程组的解法

    math & 三元一次方程组的解法 class 6 math 例题 问题: 1. 已经做好的与没有做好的比例是 5 比 7; 2 再做好51,完成总数的 70%; 3. 问,一共要做多少朵花? ...

  2. 数论学习书籍及信奥中的数学之数论相关资料

    1.数学女王的邀请 初等数论入门(2020.07) 2.初中数学竞赛中的数论初步(第2版)-2020.04 3.初等数论(2015.11) 4.数论初步(2023.01) 5.初等数论(第3版)-20 ...

  3. 同余——同余方程+线性同余方程+高次同余方程

    传送门:203. 同余方程 - AcWing题库 思路:应用欧几里得算法求 代码: #include<bits/stdc++.h> using namespace std; typedef ...

  4. 三元一次方程组步骤_人教版数学七年级下册8.4三元一次方程组的解法精讲

    学习目标 __ 1.经历探索三元一次方程组的解法的过程: 2.会解三元一次方程组: 3.能利用三元一次方程组解决简单的实际问题. 电子课本 __ 点击图片→查看大图 ▼▼▼ 知识点 __ 解三元一次方 ...

  5. 三元一次方程组步骤_《三元一次方程组及其解法》学习要点

    1 / 2 7.3 三元一次方程组及其解法 学习要点 学习目标: 了解三元一次方程组的概念,理解解三元一次方程组的基本思路,会用代入法. 加减法解三元一次方程组,掌握三元一次方程组的解法及其步骤 . ...

  6. 三元一次方程组例题_最新《三元一次方程组及其解法》例题与讲解

    最新<三元一次方程组及其解法>例题与讲解 <三元一次方程组及其解法>例题与讲解 1.三元一次方程及三元一次方程组 (1)三元一次方程: 含有三个未知数,并且含未知数的项的次数都 ...

  7. matlab中欠定方程组超定方程组_学会这些三元一次方程组的解法思路与运用,初中不再怕解方程...

    关注我,每日推送小学到初中各科学习.记忆方法.各科详细资料,帮助孩子轻松拿高分! 在七年级下册数学的学习中,我们学完二元一次方程之后就会马上学习三元一次方程,伴随而来的就是要掌握如何解三元一次方程组. ...

  8. NOI题库 数论 相关的题目 汇总-2022.01.22

    小学奥数 7654 等差数列末项计算 http://noi.openjudge.cn/math/7654/ 1.3编程基础之算术表达式与顺序执行 13 反向输出一个三位数 http://noi.ope ...

  9. 用python建立三元一次方程组的解法_三元一次方程组的解法及运用

    格式 专业资料整理 三元一次方程组的解法及运用 三元一次方程组的解法 基本步骤: ①利用代入法或加减法,把方程组中的一个方程与另两个方程分别组成两组,消去两组中的同一 个未知数,得到关于另外两个未知数 ...

  10. 铅酸蓄电池三阶simulink仿真模型,可获得蓄电池充放电特性,并提供数学模型相关文献和多组电池模型参数。

    铅酸蓄电池三阶simulink仿真模型,可获得蓄电池充放电特性,并提供数学模型相关文献和多组电池模型参数. ID:6950652335028570t***5

最新文章

  1. python08-类与对象
  2. Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
  3. Java从string数组创建临时文件
  4. Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
  5. 北京联合大学计算机学院在哪个校区,北京联合大学各校区联系地址大全
  6. oracle 查询结果升序,Oracle学习日志-8(查询结果排序)
  7. python 持续集成部署_Jenkins部署git+python项目实现持续集成
  8. 设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
  9. PyTorch 1.0 文档翻译活动期待大家的参与 | ApacheCN
  10. flex应用中如何关闭浏览器
  11. Unity 可重复随机数
  12. 厦门大学计算机专业录取分数线2019,厦门大学2019年各专业录取分数分析
  13. 修改ECharts显示的图例legend的形式
  14. Python爬取腾讯招聘信息
  15. blob导出文件及文件损坏处理
  16. Docker进阶(3)docker容器编排-docker compose、swarm、service
  17. HPP结合PHP解析URL特性的SQL注入题目
  18. No Desktop License Servers available to provide a license
  19. 点击 maven的 lean删不掉target文件
  20. 2022-4-2 Leetcode 409.最长回文串

热门文章

  1. HTTP(S)协议详解
  2. 使用 u-boot 烧写内核——韦东山嵌入式Linux学习笔记10
  3. Spring IOC 核心流程浓缩
  4. 总结java父类构造函数对子类构造函数的影响
  5. stl-map/set
  6. python装饰器模块加载后的若干解释
  7. Android读取/dev/graphics/fb0 屏幕截图
  8. 【译】How I hacked Google’s bug tracking system itself for $15,600 in bounties
  9. Android 7.1.1 锁屏界面启动流程
  10. Android插件化原理解析——Hook机制之Binder Hook