拓展欧几里得与逆元
来源:互联网 发布:mac截屏键 编辑:程序博客网 时间:2024/06/06 02:29
拓展欧几里得与逆元
前言
作为信息组众多神犇Oier中唯一的蒟蒻Oier,我终于学到了逆元(也就是神犇们看不起的很水很简单的算法),但我兴奋了一阵以后,发现了一个无奈的事实,那就是看不懂,因为神犇们的神奇思想十分的跳跃,并非我等凡人小辈可以解读的,无奈之下,只能硬着头皮慢慢读下去.皇天不负有心人,我终于混到了一个半懂不懂的水平,为了防止大家重蹈我被%神犇%的摧残经历,就打算写一篇平易近人的文章.
欧几里得算法
先来讲一下欧几里得算法(gcd)
我们定义a,b(
我们记做:
令
则c也为gcd(a,b)倍数且
int gcd ( int a , int b) { return a % b ? gcd( b , a % b ) : b ; }
拓展欧几里得
拓展欧几里得(exgcd),是以欧几里得递归相同的方式求解乘法逆元,同余方程的一种算法,同余方程一般写作如下形式.
即
因gcd(a,b)=gcd(a,-b),所以原式等价变化为:
将gcd(a,b)除过来,可得:
此时x,y系数互质,即转化成,一般同余方程形式:
或
基于我的理解,我觉得用
总结一下,此式同余方程为:
我们令:
我们假设一组数据:
当
当
当
当
当
当
当
当我们提出里边几个式子,即可看出规律:
当
当
当
x每增加
所以x增加
时
即为同余方程
的最小解.
所以可以依次性质递归下去求解同余方程.
我们令形如:
的最小解为 exgcd(a,b);
即可用此算法求解同余方程,代码如下:
int x,y void exgcd(int a,int b){ if(b==0){ x=1;y=0; return ; } exgcd(b,a%b); int k=x; x=y; y=k-(a/b)*y; return ; }
阅读全文
1 0
- 拓展欧几里得与逆元
- 拓展欧几里得/乘法逆元
- 【原创】欧几里得算法与拓展欧几里得算法的证明及其应用(不定方程、逆元)
- 拓展欧几里得和乘法逆元
- hdu 1576 拓展欧几里得 (乘法逆元) A/B
- CSU1163-寒衣调-拓展欧几里得、乘法逆元
- 欧几里得算法与逆元
- 欧几里得算法与逆元
- 扩展欧几里得与逆元
- 欧几里得算法与扩展欧几里得算法与逆元
- 数论之欧几里得与拓展欧几里得算法
- 乘法逆元与扩展欧几里得
- 扩展欧几里得 与 乘法逆元
- HDOJ 题目1576 A/B(拓展欧几里得求乘法逆元)
- 扩展欧几里得+逆元
- 拓展欧几里得
- 拓展欧几里得
- 拓展欧几里得
- Python 断言(assert)
- TLPI源代码运行与勘误表
- LeetCode No.84 Largest Rectangle in Histogram 题解
- JavaBean
- HihoCoder 1252 Kejin Game(最小割+点在割的一侧有花费建图)
- 拓展欧几里得与逆元
- jsp基本语法
- 51 nod 1247 可能的路径(exgcd)
- HDU 5925 Coconuts(二维离散化权值统计 经典)
- 55.笔记go语言——go类型
- java封装数组类
- js中事件捕获和事件冒泡
- Two Sum IV
- 数据结构实验之链表六:有序链表的建立