首页 > 其他分享 >二元一次方程的整数解、逆元及有理数求模

二元一次方程的整数解、逆元及有理数求模

时间:2024-12-21 17:32:13浏览次数:5  
标签:一次方程 求模 逆元 y1 ax x1 互质 gcd

前言

C++算法与数据结构
打开打包代码的方法兼述单元测试

一,f(a,b)求ax+by=1的任意解,a>0,b >0,且a、b互质。

暴力做法,辗转相减法:

如果a>b,则(a-b)和b互质,且都大于0。a<b,类似。
a,a == b,a,b互质说明是a和b,都是1。故返回(0,1)。
b,a>b则 令(a-b)x+by=1的解为(x1,y1) ,即ax1+b(y1-x1)=1成立,即解为(x1,y1-x1)。
c,b<a则 令ax+(b-a)y=1的解为(x1,y1),即a(x1-y1)+by1=1成立,即解为(x1-y1,y1)。
时间复杂度:O(n) b为1,要运行a次。可能有人想,1做作特殊处理,那2,3呢?

辗转相除法

如果a >= b, a/b和b都大于0,且互质。
a, b =1,返回(0,1)。
b,a=1,返回(1,0)。
c,如果a >= b。a除b等于c,余d。令dx+by=1解为(x1,y1),则(bc+d)x+by的解为:(x1,y1-cx1),下面用数学归纳法来证明:
c=1是,就是辗转相减法。
假设c成立,则根据辗转相减法,(bc+c)x+by=1的解(x1,y1-cx1-x1),得证。
d,如果a < b。ax+dy=1的解为(x1,y1)。
解为:(x1-y1*c,y1)。
时间复杂度:O(logmax(a,b)) ,当min(a,b)为1的时,结束。故max(a,b)每次至少除以2。

已知任意解,如何求最小自然数解

d = a,b的最小公倍数。
y = ax1%d
如果y < 0则 y +=d。
y/a就是最小自然数解。

求ax+by=gcd(a,b)的解

g = gcd(a,b)如果g为0,说明a,b为0,任意整数都是解,如:(0,0)。
如果g不为0,则    ⟺    \iff ⟺ a/gx+b/gy=1。

求ax+by=c

如果g ≠ \neq = gcd(g,c) 则无解。
令 a/gx+b/gy=1 是(x1,y1),则解是(c/gx1,c/gx2)。

乘法逆元

乘法逆元的定义可以直观地理解为a的倒数,即与a相乘等于1的数。在模运算中,如果a和b互质(即最大公约数为1),那么存在一个整数x,使得a×x≡1(mod b)

有理数求模

如果p是质数,可以通过逆元求,我有模板。非质数,也可以,太麻烦,我没模板。可以直接求bx+py=a(式子一)的任意解。
如果式子一无解,说明a不是gcd(b,p)的倍数,则bx=a%p一定无解。
如果式子一有任意解(x1,y1),则a = bx1+py1,则 (a/b)p=(x1+py1/b)%p= x1%p。即 x1%p是解。待证点一:b对模p,存在逆元d。
求b存在逆元:
即bx%p=1有解,即bx+py=1即bp互质。本题的p是固定,且是质数。且0 < b < p,故互质。
本质:用二元一次方程求逆元。之所以看起来不一样,是因为我的旧模板是费马小定理,新方式是扩展欧几里得(二元一次方程)。
总结
:除数b为0,无意义。其它情况b和p互质,故一定有逆元。

封装类

解ax+by=gcd(a,b) a,b无需互质,可以全部或部分为负数。

class Caxby1 {
public:
	Caxby1(int a, int b) :G(m_iG) {
		m_iSignA = (a < 0)?-1:1;
		m_iSignB = (b < 0)?-1:1;
		m_a = abs(a);
		m_b = abs(b);
		m_iG = gcd(m_a, m_b);
	}
	tuple<int, int> Any() {//ax+by=gcd(a,b)的任意解
		if (0 == m_iG) { return { 0,0 }; }
		auto [x,y]= Any(m_a / m_iG, m_b / m_iG);
		return { m_iSignA * x,m_iSignB * y };
	}
	const int& G;
private:
	static pair<int, int> Any(long long a, long long b) {//求ax+by=1的整数解,a>0,b>0,a,b互质,a,b int32范围
		if (1 == a) { return { 1,0 }; }
		if (1 == b) { return { 0,1 }; }
		//如果a,b相等且互质,则两者一定都是1。
		if (a > b) {
			auto c = a / b, d = a % b;
			if (0 == d) { d = b; c--; }
			auto [x1, y1] = Any(d, b);
			return { x1, y1 - c * x1 };
		}
		auto [x2, y2] = Any(b, a);
		return { y2,x2 };
	}

private:
	int m_a, m_b, m_iG, m_iSignA, m_iSignB;
};

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

标签:一次方程,求模,逆元,y1,ax,x1,互质,gcd
From: https://blog.csdn.net/he_zhidan/article/details/144557750

相关文章

  • 202 逆元1
    //202逆元1.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/21/problem/490给一个素数p,求1∼n关于p的逆元。由于输出可能很大,只需要求这些逆元的异或和即可。输入格式一行,两个整数p,n。输出格式一个整数,表示1到n......
  • 乘法逆元小结
    什么是乘法逆元当有$a*x≡1\pmod{p}$时,则\(a\)是模$p$意义下的乘法逆元。费马小定理求逆元费马小定理$a≡a^{p-1}\pmod{p}$所以$a^{p-2}≡1\pmod{p}$求\(a^{p-2}\bmodp\)即可。当且仅当\(p\)为质数且\(a,p\)互质时可用。intksm(intx,......
  • 1.1.4 逆元
    1.1.4逆元主要内容:扩欧求逆元,快速幂求逆元,线性(递归)求逆元,同余模公式(补充),反复平方法求幂(补充)一、逆元首先给出逆元的定义:$$\begin{aligned}假设a\cdotp&\equiv1\quad(mod\quadb)\\且(a,b)&=1\quad即\quada,b互素\\则称p为a的逆元&,记作p=a^{-1}\end{aligned}$......
  • 三种求逆元方法小结
    逆元(自学内容)define:若ax≡1modf,则称a关于1模f的乘法逆元为x。也可表示为ax≡1(modf)。当a与f互素时,a关于模f的乘法逆元有解。如果不互素,通过公式‘a/bmodp=(amod(b·p))/b’来转化计算逆元方式:(条件a,p互质)费马小定理(a\(^{p-1}\)≡1(modp))(a,p互质时,\(a^{fine(p)}......
  • RocketMQ消息者PULL请求模式拉取消息
    引言RocketMQ消费者PULL请求模式拉取消息,是通过消费者端与服务端Broker的多个线程进行配合,做到消息拉取的及时与减少拉取的Broker性能损耗(通过长连接)。消费者处理发起拉取请求的线程PullMessageService服务端Broker处理未拉取到消息的hold线程PullRequestHoldService服......
  • HarmoryOS 网络请求模块及Axios库的封装
            我们在使用DevEecStudio进行网络请求时,需选择一个稳定、高效的网络库作为基础,如Axios、FetchAPI、Moya等;需要对网络请求的基本配置进行统一设定,比如基础URL、超时时间、默认请求头等;要进行错误处理:封装时应该考虑各种可能的错误情况,并提供统一的错误处理逻......
  • Python-解三元一次方程(Part.2)
    一、需要解的方程组为:x+y+z=26x-y=12x-y+z=18 二、下面进入代码实现:1、导入Sympy库中的符号、方程和求解函数fromsympyimportsymbols,Eq,solve 2、定义变量x,y,z=symbols('xyz') 3、定义方程组#方程1:x+y+z=26eq1=Eq(......
  • P5431 【模板】模意义下的乘法逆元 2
    看到5e6的数据,500ms的时限,\(O(NlogN)\)快速幂直接跑肯定会T掉,那我们就要考虑优化一下式子。我们令\(s=\prod_{1}^{n}{a[i]}\),那我们给第i个式子通分,就为$\frac{k^i*s/a[i]}{s}$\(s/a[i]\)就相当于$\prod^{i-1}_{1}{a[i]}*\prod_{i+1}^{n}{a[i]}$因此我们只需要预......
  • 逆元
    逆元用于求$\frac{a}{b}(mod\p)$的结果第一种方法:拓展欧几里得利用拓欧求解同余方程:\(a*x≡c\(mod\b)\)的\(c=1\)的情况就可以转化成求解\(a*x+b*y=1\)这个方程voidexgcd(lla,llb,ll&x,ll&y)//解ax+by=gcd(a,b)的一组整数解{ if(b==0) { ......
  • 快速计算多个树的逆元
    设\(n\)个数分别为\(a_1\dotsa_n\),令\(s_i\)为\(a_i\)的前缀积,那么对于\(1\lei<n\)有\(s_i^{-1}=s_{i+1}^{-1}*a_{i+1}\),那么\(a_i^{-1}=s_i^{-1}*s_{i-1}\),可以\(\Theta(n+\logp)\)的求出\(n\)个数的逆元例题:LOJ161乘法逆元2#include<cstdio>typedeflonglongll;c......