首页 > 其他分享 >gcd

gcd

时间:2022-11-26 19:12:14浏览次数:45  
标签:mathbb gcd dfrac bmod times cases

use C++11

最大公约数

  1. 若 \(a,b\in \mathbb N\) 且 \(k \mid a,b \in \mathbb N\),且不存在更大的 \(k\),称 \(k\) 是 \(a,b\) 的最大公约数。

  2. 快速求 \(a,b\in \mathbb N\) 的最大公约数,欧几里得定理:\(\gcd(a,b)=\gcd(b,a \bmod b)\)。

  3. 已知 \(a,b \in \mathbb N\),可找到 \(x,y \in \mathbb Z\) 使 \(a\times x +b\times y=\gcd(a,b)\),若 \(a\times x+b\times y=1\) 有解,则 \(a\) 和 \(b\) 互质。

  4. 扩展欧几里得,一定存在 \(x,y\in \mathbb N\) 使贝祖等式 \(a\times x +b\times y=\gcd(a,b)\)\(\Rightarrow (\left \lfloor a \div b \right \rfloor \times b + a \bmod b) \times x + b\times y = \gcd(b,a\bmod b)\)\(\Rightarrow (\left \lfloor a \div b \right \rfloor \times x + y)\times b +(a \bmod b)\times x\),可得新的方程 \(b \times x'+(a \bmod b)\times y' = \gcd(b,a\bmod b)\) 因此可得 \(\begin{cases}x'=(\left \lfloor a \div b \right \rfloor\times x+y)\\y'=x\end{cases}\),同样倒推可得特解 \(\begin{cases}x=y'\\y=x'-(\left \lfloor a \div b \right \rfloor\times y')\end{cases}\),下面是递归代码实现。

#include<array>
array<long long,3> exgcd(long long a,long long b){
	if(b==0)	return {1,0,a};
	//当b=0时,等式为ax=gcd(a,0),即ax=a
	//得x=1,y=0
	array<long long,3> ans=exgcd(b,a%b);
	long long temp=ans[0];
	ans[0]=ans[1];
	ans[1]=temp-a/b*ans[1];
	return ans;//ans[0]为x,ans[1]为y,ans[2]为gcd(a,b)
}
  1. 当求得贝祖等式特解 \(x_0,y_0\in \mathbb N\) 后,可得 \(x,y\in \mathbb N\) 通解,设 \(g=\gcd(a,b)\) 通解为 \(\begin{cases}x=x_0+t\times b\div g\\y = y_0- t \times a \div g\end{cases}\),推导过程:\(\begin{cases}a\times x+b\times y=g\\a\times x_0+b\times x_0=g\end{cases}\)\(\Rightarrow (x-x_0)\times a+(y-y_0)\times b=0\)\(\Rightarrow (x-x_0)\times a=(y_0-y)\times b\)\(\Rightarrow (x-x_0)\times \dfrac{a}{g}=(y_0-y)\times \dfrac{b}{g}\)\(\Rightarrow \begin{cases}x-x_0=t\times \dfrac{b}{g}\\y_0-y=t \times \dfrac{a}{g}\end{cases}\)\(\Rightarrow \begin{cases} x=x_0+t\times\dfrac{b}{g}\\y=y_0-t\times\dfrac{a}{g}\end{cases}\),其中 \(x\) 的第一个解是 \(\bigg(x\bmod\dfrac{b}{g}+\dfrac{b}{g}\bigg)\bmod \dfrac{b}{g}\)。

模运算

  1. 已知 \(a,b,p\in \mathbb N\),\((a+b)\bmod p=(a\bmod p+b\bmod p)\bmod p\),\((a-b)\bmod p=(a\bmod p+b\bmod p)\bmod p\),\((a\times b)\bmod p=(a \bmod p\times b\bmod p)\bmod p\)。

  2. 若需要进行除法的模运算,与普通的不同,例子:\(\dfrac{20}{10}\bmod 5 \neq \dfrac{20 \bmod 5}{10\bmod 5}\bmod 5\),所以为了求 \((a\div b) \bmod p\),\(a,b,p\in\mathbb N\),需要找到 \(b\) 的乘法逆元 \(x\in\mathbb N\),将算式变成 \((a\times x)\bmod p\)。

  3. 已知 \(a,x,m\in \mathbb N\),\(ax \equiv 1\pmod p\)\(\Rightarrow ax \bmod p=1\)\(\Rightarrow ax-\left\lfloor\dfrac{ax}{p}\right\rfloor\times p=1\),称 \(x\) 是关于 \(a\) 的乘法逆元,将 \(-\left\lfloor\dfrac{ax}{p}\right\rfloor\) 用 \(y\) 替代,得 \(ax+py=1\),即找到 \(x\) 的值即可找到 \(a\) 的乘法逆元,也可知 \(a,p\) 必须要互质。

标签:mathbb,gcd,dfrac,bmod,times,cases
From: https://www.cnblogs.com/wanguan/p/16928082.html

相关文章

  • 2021 陕西省赛 C - GCD // 整除分块
    题目来源:2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛题目链接:https://ac.nowcoder.com/acm/contest/35232/C题意给定三个整数\(l\)、\(r\)、\(......
  • 题解 I. gcd -“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛(正式赛)
    传送门VP的时候失误推错太多次了,写个博客总结一下【大意】求所有长度为\(m\)且和为\(n\)的正整数序列\(a\)的贡献和。其中,每个数列的贡献为\(\displaystyle\s......
  • GCD算法
    以下是记录的一些笔记:有些混乱,寒假再来细细整理。   python实现:defgcd(a,b):while(b!=0):r=a%ba,b=b,rreturnaprint(gc......
  • 2022NOIP A层联测33 GCD 简单题 建筑 树上前缀和
    T1:[图论/枚举]给出有边权无向图,边权保证互不相同,Q次询问从S到T的路径中,边权的gcd最大是多少。(n<=1e4,Q<=2e5,w<=1e6)考场根据之前的一道图论题经验,在最短路上加个“\(w......
  • UVA Magical GCD
    ​​MagicalGCD​​题意:给定一个数列,求一个子列,该子列的最大公约数乘上子列长度的值最大,输出最大值。数列的大小是100000,这些数的大小是1-10^12。解题思路:一开始想的是用暴......
  • B. Playing with GCD
    传送门题意:一个长度为n的数组a,\(a_i=gcd(b_i,b_{i+1})\),问是否存在这样的b数组能够构成a思路:总结:gcd可以推导出lcm的规律,图片中的那个>=关系是代表......
  • 裴蜀定理、exgcd与有理数取余
    裴蜀定理exgcd之前写得不好所以重写一遍exgcd即扩展欧几里得算法,常用来求\(ax+by=\gcd{(a,b)}\)的一组解。设一组解为\(x_1,y_1\),即\(ax_1+by_1=\gcd{(a,......
  • P6786 「SWTR-6」GCDs & LCMs
    题意:小A有一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)。他想从这些数中选出一些数\(b_1,b_2,\cdots,b_k\)满足:对于所有\(i\(1\leqi\leqk)\),\(b_i\)要么是......
  • 【模板】二元一次不定方程 exgcd
    postedon2022-09-1715:59:26|under模板|sourcecodeLLmod(LLx,LLm){return(x%m+m)%m;}LLexgcd(LLa,LLb,LLc,LL&x,LL&y){ if(!b)returnx=c/a,y=0,a;......
  • Luogu P5435 基于值域预处理的快速 GCD
    最近做这道题的时候被卡常了,然后突然想起来曾经偶然在陈指导的博客看到过这个\(O(1)\)做\(\gcd\)的方法其实理解了之后还是比较简单的,以下设数的值域为\(S\)首先我们定义......