大衍求一术的计算方法
引言
大衍求一术是秦九韶发明的一种求特殊一次同余式的方法,以下摘自百度百科
秦九韶,字道古,生活于南宋时期,自幼喜好数学,经过长期积累和苦心钻研,于公元1247年写成《数书九章》。这部中世纪的数学杰作,在许多方面都有创造,其中求解一次同余组的“大衍求一术”和求高次方程数值解的“正负开方术”,更是具有世界意义的成就。
进入正题
对于形如ax ≡ 1 (mod n),(a,n) = 1的同余式,秦九韶的大衍求一术给出了一种优秀的解法。
注意a,n必须互素
第一步我们令k0 = 0,k1 = 1, r0 = n, r1 = a,(k叫乘率,也是最后答案)
第二步我们让 r0 和 r1 作带余除法,即 r0 = q2r1 + r2,
第三步我们用 r1 和 r2 作带余除法,即r1 = q3r2 + r3
...
直到出现rn = 1, 这时我们带回同余方程
定义kn = kn-2 - qnkn-1,依次回代求得kn即是同余方程的解
举个栗子
37x ≡ 1 (mod 73)
(37,73)=1,所以满足使用大衍求一术的条件
首先我们令k0 = 0,k1 = 1,r0= 73,r1=37
r0/r1: 73=37*1+36 =>q2=1,r2=36
r1/r2: 37=36*1+1 =>q3=1,r3=1
此时r3=1,停止除法,代回求解
k2=k0-q2k1,
k3=k1-q3k2
=>k3=2
因此37 x≡ 1 (mod 73)的解为
x ≡ 2 (mod 73)
代码实现
1 int dyqy(int a, int p) 2 { 3 if (__gcd(a, p) != 1) 4 return -1; //不能用大衍求一术 5 vector<int> k, r, q; 6 k.emplace_back(0), k.emplace_back(1); //k0=0,k1=1 7 r.emplace_back(p), r.emplace_back(a); //r0=p,r1=a 8 q.emplace_back(-1), q.emplace_back(-1); 9 int i = 0; 10 while (1) 11 { 12 int ra = r[i], rb = r[i + 1]; 13 int qtmp = ra / rb; 14 int rtmp = ra % rb; 15 q.emplace_back(qtmp); 16 r.emplace_back(rtmp); 17 ++i; 18 if (rtmp == 1) 19 break; 20 } 21 int sz = r.size(); 22 for (int i = 2; i < sz; i++) 23 { 24 int ktmp = k[i - 2] - k[i - 1] * q[i]; 25 k.emplace_back(ktmp); 26 } 27 return k.back(); 28 }
大衍求一术
转载于:https://www.cnblogs.com/mooleetzi/p/11297722.html
大衍求一术的计算方法相关推荐
- 学习笔记三:MLP基本原理、矩阵求导术推反向传播、激活函数、Xavier
文章目录 一.BP神经网络(MLP) 1.1 感知机模型及其局限性 1.2 BP神经网络基本原理 1.3 softmax多分类.求导 1.4 二分类使用softmax还是sigmoid好? 1.5 为 ...
- 二阶矩阵转置怎么求_矩阵求导术(下)
本文承接上篇 https://zhuanlan.zhihu.com/p/24709748,来讲矩阵对矩阵的求导术.使用小写字母x表示标量,粗体小写字母 表示列向量,大写字母X表示矩阵.矩阵对矩阵的求导 ...
- 矩阵求导术(上、下)
点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 矩阵求导的技术,在统计学.控制论.机器学习等领域有广泛的应用.鉴于我看过的一些资料或言 ...
- 计算机系大神和数学系系花,小甜文:《一贱钟情,大神求放过》1v1双C,男主小奶狗,全程高甜...
最近很多书迷都反应不知道看什么书好,不知不觉的就陷入了书荒的境地,作为老书迷的小编对此也感同身受.今天小编继续给书迷们介绍好看的小说,分分钟让书迷朋友们看上瘾不睡觉!看好的话记得收藏,不怕以后再书荒了 ...
- 神经网络中矩阵求导术的应用
神经网络中矩阵求导术的应用 序 记法约定 常用公式和定理 举例 多层神经网络(MLP)的梯度推导 Batch Normalization Layer的推导 序 本文假设读者熟悉一元微积分,线性代数,并 ...
- 切面条/猜字母/大衍数列/奇怪的分式
题目2.切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条.如果连续对折2次,中间切一刀,可以得到5根面条.那么,连续对折10次,中间切一刀,会得到多少 ...
- 蓝桥杯—切面条/大衍数列
1.问题描述 1.一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条. 如果连续对折2次,中间切一刀,可以得到5根面条. 那么,连续对折10次,中间切一刀,会得 ...
- 【LeeCode】赛题02:Python解答大衍数列题目
题目:大衍数列 中国古代文献中,曾记载过"大衍数列", 主要用于解释中国传统文化中的太极衍生原理. 它的前几项是:0.2.4.8.12.18.24.32.40.50 - 查看规律 ...
- 快速幂算法和大整数求模
** 1.快速幂的算法** (1)当我们求一个数的n次方的的结果时,若直接选择for循环,来累乘的话,效率很低,时间复杂度位O(n),而当我们选择快速幂来计 算时,时间复杂度能达到O(logn),快了 ...
最新文章
- 简单易学的深度学习算法:Wide Deep Learning
- 第三次学JAVA再学不好就吃翔(part57)--StringBuffer和String的相互转换
- ASP.NET MVC3 异步刷新
- equals 和 == 的区别?知乎转载
- 厦门理工C语言实验报告8,厦门理工c语言数据结构实验
- JDBC连接sql server数据库
- python基础入门(3)之字符串
- SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查
- (十八)密度聚类DBSCAN
- CSS-Box模型--理解与整理
- Atitit 获取本机图像设备视频设备列表 设备检索列表解决方案
- eclipse java常用插件_高阶程序员必备25个最好的免费Eclipse插件
- 【数据结构实验】单链表实验
- ttest函数使用方法_TTEST 函数的学习方法(Excel)
- Vue官网下载Vue.js和Vue.min.js
- iOS设备分辨率 UI规范 以及适配
- 小牛电动Q2财报:国外不乐观,国内狂下沉
- Python初探(四,五)
- HDOJ(HDU) 1862 EXCEL排序(类对象的快排)
- cobol .cpy文件_Visual COBOL R3:“使传统的COBOL能够部署在JVM或.NET上”。