同余方程

同余方程详解

匆匆过客 提交于 2020-02-07 00:07:40
同余概述 定义: 同余给定正整数 m m m ,若用 m m m 去除两个整数 a a a 和 b b b ,所得的余数相同,称a和b对模 m m m 同余,记作 a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,并称该式为同余式,否则,称 a a a 和 b b b 对模 m m m 不同余。 定理: a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,当且仅当 m ∣ ( a − b ) m|(a-b) m ∣ ( a − b ) a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,当且仅当存在正整数 k k k ,使得 a = b + k m a=b+km a = b + k m 同余关系是等价关系,即 (1)自反性: a ≡ a ( m o d m ) a≡a(mod\ m) a ≡ a ( m o d m ) (2)对称性: a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,则 b ≡ a ( m o d m ) b≡a(mod\ m) b ≡ a ( m o d m ) (3)传递性: a ≡ b ( m o d m ) , b ≡ c ( m o d m ) a≡b(mod\ m)

(扩展)BSGS与高次同余方程

不打扰是莪最后的温柔 提交于 2020-01-30 07:05:46
前言: 今天更BSGS算法。俗称大步小步算法(Big-Step G…-Step),又称拔山盖世、北上广深、 白色狗屎 。 问题: 求解指数同余方程: a x ≡ b ( m o d    p ) a^{x}\equiv b(mod\; p) a x ≡ b ( m o d p ) 的最小自然数解。 BSGS算法: 模板题 这个算法只考虑 g c d ( a , p ) = 1 gcd(a,p)=1 g c d ( a , p ) = 1 的情况。 那么,怎么做呢。 其实做法很简单,就是 枚举 。 先来一种 暴力枚举 。 就是枚举 x x x 从 [ 0 , p − 1 ] [0,p-1] [ 0 , p − 1 ] ,然后检验答案是否正确。 知道欧拉定理的应该知道只要枚举到 φ ( p ) − 1 \varphi(p)-1 φ ( p ) − 1 ,但 p p p 为质数时欧拉函数仍为 p − 1 p-1 p − 1 。 看过 阶与原根 的应该知道只要枚举到 p p p 的阶即可,但算 p p p 的阶仍然要暴力去枚举。 所以这里只要一个一个枚举过去便好。 但是 o ( p ) o(p) o ( p ) 的暴力枚举配不上这么高大上的名字,所以还有优化的余地。 我们可以考虑 折半枚举 。 怎么折半,就是这个算法的精髓了。 我们令 x = k n + i x=kn+i x = k n

同余意义下的运算法则与逆元、和二次剩余、和数论四大定理

让人想犯罪 __ 提交于 2020-01-27 00:29:30
同余:(这里只讲整数的同余) 10 10 1 0 除以 7 7 7 余数是 3 3 3 , 17 17 1 7 除以 7 7 7 余数也是 3 3 3 ,那么就称 10 10 1 0 与 17 17 1 7 在模 7 7 7 意义下同余,符号表示为    10 ≡ 17    ( m o d    7 ) \;10\equiv 17 \; (mod \; 7) 1 0 ≡ 1 7 ( m o d 7 ) 。 然后,很容易得到一些性质: 自反性: a ≡ a    ( m o d    m ) a\equiv a \; (mod \; m) a ≡ a ( m o d m ) 对称性:若    a ≡ b    ( m o d    m ) \;a\equiv b \; (mod \; m) a ≡ b ( m o d m ) ,则    b ≡ a    ( m o d    m ) \;b\equiv a \; (mod \; m) b ≡ a ( m o d m ) 传递性:若    a ≡ b    ( m o d    m ) \;a\equiv b \; (mod \; m) a ≡ b ( m o d m ) ,且    b ≡ c    ( m o d    m ) \;b\equiv c \; (mod \; m) b ≡ c ( m o d m ) ,则    a

数论基础原理总结

风流意气都作罢 提交于 2020-01-18 05:45:06
UPD:2018.4.25 更新了快速求原根的啰嗦的证明 一、整除的性质 1,如果a|b,且b|c,则a|c 2,a|b且b|c,那么a|c 3,设m!=0,那么a|b等价于(m*a)|(m*b) 4,设整数x和y满足下式,a*x+b*y=1,且a|n,b|n,那么(a*b)|n 根据性质3可得,(a*b)|(n*b),(a*b)|(n*a), 根据性质4可得,(a*b)|x*(n*a)+y*(n*b) 化简上式,(a*b)|n*(a*x+b*y)=>(a*b)|n*(1),证毕 5,若b=q*d+c,那么d|b的充要条件是d|c 其他 约定0可以被任何数整除 若2能整除a的最末位,则2|a 若4能整除a的后两位,则4|a 若8能整除a的后三位,则8|a.以此类推不再赘述 若3能整除a的各位数字之和,则3|a 若9能整除a的各位数字之和,则9|a 若11能整除a的偶数位数字之和与奇数位数字之和的差,则11|a 同时能被7,11,13整除的数的特征是,这个数的末三位与末三位以前的数字所组成的数能被7,11,13整除,则这个数就能被7,11,13整除 显然成立容易忽略的细节? 若a|b,则a是b的一个因子, 若a|b,则a<=b 二、GCD GCD据我的理解可以形象化的理解为,数字的最长公共子结构 所以不仅仅是两个数之间的 一堆数的GCD,显然可以先从某两个数的GCD开始

AcWing 878 线性同余方程

我们两清 提交于 2020-01-14 00:24:41
题目描述: 给定n组数据ai,bi,mi,对于每组数求出一个xi,使其满足ai∗xi≡bi(mod mi),如果无解则输出impossible。 输入格式 第一行包含整数n。接下来n行,每行包含一组数据ai,bi,mi。 输出格式 输出共n行,每组数据输出一个整数表示一个满足条件的xi,如果无解则输出impossible。 每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可。 输出答案必须在int范围之内。 数据范围 1≤n≤10^5,1≤ai,bi,mi≤2∗10^9 输入样例: 2 2 3 6 4 3 5 输出样例: impossible 7 分析: a∗x≡b(mod m)等价于ax - my' = b,令y = -y',得到ax + my = b,便可以使用扩展欧几里得算法进行求解了。当gcd(a,m) | b时,该线性同余方程有解,否则无解。我们只需先求解ax + my = gcd(a,m)的解,然后对系数x和y扩大b / gcd(a,m)倍即可得到方程ax + my = b的解了。 更一般的,ax+by =c的特解为x0,y0,d=gcd(a,b),则方程的通解为x = x0 + kb/d,y = y0 - ka/d。k为任意整数,这是因为想要在x中加上的参数乘上a后与另一项参数乘以b后抵消,即a(x+z1)+b(y-z2)=c,可以得到az1=bz2

洛谷P1082 同余方程 题解

岁酱吖の 提交于 2020-01-06 15:51:12
题目链接: https://www.luogu.com.cn/problem/P1082 题目大意: 求关于 \(x\) 的同余方程 ax≡1(mod b) 的最小正整数解。 告诉你 \(a,b\) 求 \(x\) 。 解题思路: 直接套扩展GCD模板。 实现代码如下: #include <bits/stdc++.h> using namespace std; typedef long long ll; void gcd(ll a , ll b , ll &d , ll &x , ll &y) { if(!b) {d = a; x = 1; y = 0;} else { gcd(b , a%b,d,y , x); y -= x * (a/b); } } ll inv(ll a , ll n) { ll d , x , y; gcd(a , n , d, x , y); return d == 1 ? (x+n)%n : -1; } ll a, b; int main() { cin >> a >> b; ll c = inv(a, b); cout << c << endl; return 0; } 来源: https://www.cnblogs.com/quanjun/p/12152278.html

浅谈欧拉定理及乘法逆元

帅比萌擦擦* 提交于 2019-12-09 20:40:10
浅谈欧拉定理及乘法逆元 本篇随笔简单讲解一下信息学奥林匹克竞赛数论部分 欧拉定理及乘法逆元 这一知识点。介绍的内容大致分为这么几个部分: “同余的基本概念、费马小定理、欧拉定理及其推论、乘法逆元” 。 同余的基本概念 同余的概念啊非常简单啦:如果两个整数 \(a,b\) 除以一个数 \(m\) 的余数相等的话,那么就叫做 \(a,b\) 在模 \(m\) 的意义上同余。 记作: \[ a\equiv b\,\,\,(mod\,\,m) \] 那么根据同余的这个定义,我们很容易能推导出一个性质:如果两个数 \(a,b\) 在模 \(m\) 的意义下同余,那么 \(a-b\) 就是 \(m\) 的倍数,这是显然的。 以及,如果 \(a\%m=1\) ,那么就可以被改写成这样的式子: \[ a\equiv 1\,\,\,(mod\,\,m) \] 这个转化的正确性也是显然的。 费马小定理 费马小定理也非常简单啦!用语言描述就是,如果一个数 \(p\) 是质数,那么对于一个不为 \(p\) 的倍数的整数 \(a\) ,有 \(a^{p-1}\equiv 1\,\,\,(mod\,\,p)\) 。那么把这个结论两边同时乘上一个 \(a\) ,即可得出:对于任意的整数 \(a\) , \(a\) 的 \(p\) 次幂与 \(a\) 在模 \(p\) 的意义上同余。 即: \[ a^p

C Looooops POJ - 2115

陌路散爱 提交于 2019-12-06 15:18:48
数论好题。。 香! 首先我们看到这一题, 题意是 \[ a + c * x \equiv b (mod \ \ 2 ^ k)\] 对此式移一下项, 得 \[ c * x \equiv b - a (mod \ \ 2 ^ k)\] 此时原式为标准线性同余方程。 \(exgcd\) 解得 \(x\) 后,x 要做如下处理 : 设 \(g = gcd(b - a, 2 ^ k), k = 2 ^ k, d = b - a\) 1#. \(x = x * (d / g)\) , 此时求得一组特解(因为 \(exgcd\) 解出的是 \(RHS = gcd\) 时的解,所以需要乘倍数) 2#. \(x = (x \% (k / g) + k / g) % (k / g)\) , 此时求得最小正整数解。 \(\text{TIP : 1. 本题无需开int64 2. 1# 无需加%k}\) 来源: https://www.cnblogs.com/yangxuejian/p/11992466.html

模板 - 数学 - 同余 - 扩展欧几里得算法/ExtendEuclideanAlgorithm

无人久伴 提交于 2019-12-04 22:00:35
修复了溢出longlong的bug。在int128下也不容易进一步溢出了。求解模n意义下a的逆元,即求方程LCE2(a,1,n,x),结果放入x中,返回值指示是否有解。 ll gcd(ll a, ll b) { if(b == 0) return a; while(ll t = a % b) a = b, b = t; return b; } ll ex_gcd(ll a, ll b, ll& x, ll& y) { if(b == 0) { x = 1, y = 0; return a; } ll d = ex_gcd(b, a % b, x, y), t; t = x, x = y, y = t - a / b * y; return d; } //解线性同余方程 ax + by = c ,无解返回false bool LCE1(ll a, ll b, ll c, ll &x0, ll &y0) { ll x, y, d = ex_gcd(a, b, x, y); if(c % d) return false; ll k = b / gcd(a, b); x0 = ((x % k) * (c / d % k) % k + k) % k; y0 = (c - a * x0) / b; //x0是x的最小非负整数解 //x=x0+b*t,y=y0-a*t,是方程的所有解

【NOIP2012】同余方程

匿名 (未验证) 提交于 2019-12-03 00:13:02
原题: 求关于 x x的同余方程ax≡1(mod b) 的最小正整数解。 裸题 当年被这题劝退,现在老子终于学会exgcd了哈哈哈哈哈哈哈哈 ax≡1(mod b) => ax=1+by => ax-by=1 => ax+by=1 若要保证有解,必须满足gcd(a, b)|1即gcd(a, b)=1 那么exgcd搞完之后只需加减b就能得到最小非负整数解 注意这里不是在解出y<0的情况下让x=-x 因为这里符号变化的是b,也就是说如果要求输出y,那么y应该等于-y 而跟x没有什么关系 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define LL long long 8 LL exgcd(LL a,LL b,LL &x,LL &y){ 9 if(!b){ x=1,y=0; return a;} 10 LL d=exgcd(b,a%b,x,y); 11 LL _x=x,_y=y; 12 y=_x-(a/b)*_y,x=_y; 13 return d; 14 } 15 LL a,b; 16 int main(){ 17 //freopen("ddd.in","r"