线性同余方程

一元线性同余方程

定义:a,b是整数,m是正整数,形如 a*x = b (mod m) 且x是未知整数的同余式称为一元线性同余

定理:a,b,m 是整数且m > 0 (a,m) = d,如果d | b,则方程恰有d个模不同余的解,否则方程无解   如 a/d = b/d (mod m/d) 乘以d--> a = b (mod m/d) b一定要是d的倍数方程才有结

由同余方程的定义可得 a*x + m*y = b (y为整数),这个方程称为二元一次不定方程.

怎么解该方程

扩展欧几里德解方程一定有解 a*x + m*y = d = gcd(a,m) 方程两边同除以d 得到 a*x/d + m*y/d = 1,然后用扩展欧几里德求解该方程x,y.该解也是a*x + m*y = 1 的解方程同除解不变

但是我们要求a*x + m*y = b的解 所以方程两边同乘以b 解得 a*b*x/d + m/d*b*y = b; 等式两边同乘同除结果不变,但是我们要求的是a*x + m*y = b的解x= x /d *b;

这是一个解,怎么求最小正整数解呢?

x 是一个特殊解,a*x/d*b + m/d*b*y = b -- >  a*x/d*b = b (mod m/d)

其他的解都关于m/d与 x 同余。即x≡x+(m/d)*t (mod m)    (0≤t≤d-1)。

解一元线性同余方程组

任何一元同余方程都可变成若干个形如 x = b (mod m)的方程

对于模线性方程组,不管这样的方程有多少个,都可以两两解决,求得方程组的最终解

x = b1 (mod m1)

x= b2 (mod m2)

n1*m1 + b1 = n2*m2 + b2 即  n1*m1 - n2*m2 = b2 -b1

可以用扩展欧几里得n1,n2,从而得出 xs = m1*n1 + b1;想让 x + x = b1 (mod m1) 说明 x是m1的倍数,同理x1+ x = b2 (mod m2) 说明 x是m2的倍数

x1 除 m1 余b1 且是 m2的倍数

x2 除 m2 余b2 且是 m1的倍数

所以最终解一定是lcm(m1,m2)的倍数

x = xs (mod lcm(m1,m2))

再和以后的式子一直求解得到最终解






### 快慢指针与带环结构 快慢指针是一种常用的算法技巧,由两个指针以不同的速度遍历数据结构。在链表中,快指针每次移动两步,慢指针每次移动一步。当链表存在环时,快指针会先进入环,然后在环内不断循环,直到慢指针也进入环,最终快指针会追上慢指针,二者相遇,以此可以判断链表是否有环,这是快慢指针在带环链表中的典型应用。 ```python class ListNode: def __init__(self, x): self.val = x self.next = None def hasCycle(head): slow = head fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return False ``` ### 快慢指针、带环结构与线性同余方程的关联 当快慢指针在带环结构中运动时,其位置关系可以用线性同余方程来描述。假设环的长度为 \( L \),当快指针和慢指针相遇时,快指针比慢指针多走了 \( n \) 圈(\( n \) 为正整数)。设慢指针走了 \( s \) 步,快指针走了 \( f \) 步,则有 \( f = 2s \),且 \( f = s + nL \),由此可得 \( s = nL \)。这就是一个线性同余方程的体现,通过这个方程可以分析出快慢指针在环内的位置关系以及相遇的条件。 ### 线性同余方程在带环结构中的应用 在带环链表中,利用线性同余方程可以进一步确定环的入口位置。当快慢指针相遇后,让一个指针从链表头开始,另一个指针从相遇点开始,以相同的速度移动,它们再次相遇的点就是环的入口。这是因为根据线性同余方程的推导,从链表头到环入口的距离等于从相遇点绕环到环入口的距离加上若干圈环的长度。 ```python def detectCycle(head): slow = head fast = head has_cycle = False while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: has_cycle = True break if not has_cycle: return None slow = head while slow != fast: slow = slow.next fast = fast.next return slow ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值