引言

大衍求一术是秦九韶发明的一种求特殊一次同余式的方法,以下摘自百度百科

秦九韶,字道古,生活于南宋时期,自幼喜好数学,经过长期积累和苦心钻研,于公元1247年写成《数书九章》。这部中世纪的数学杰作,在许多方面都有创造,其中求解一次同余组的“大衍求一术”和求高次方程数值解的“正负开方术”,更是具有世界意义的成就。


进入正题

对于形如ax ≡ 1 (mod n),(a,n) = 1的同余式,秦九韶的大衍求一术给出了一种优秀的解法。

注意a,n必须互素

第一步我们令k= 0,k= 1, r= n, r= a,(k叫乘率,也是最后答案)

第二步我们让 r0 r1 作带余除法,即 r= q2r+ r2,

第三步我们用 r1 和 r2 作带余除法,即r1 = q3r2 + r3

...

直到出现r= 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

大衍求一术的计算方法相关推荐

  1. 学习笔记三:MLP基本原理、矩阵求导术推反向传播、激活函数、Xavier

    文章目录 一.BP神经网络(MLP) 1.1 感知机模型及其局限性 1.2 BP神经网络基本原理 1.3 softmax多分类.求导 1.4 二分类使用softmax还是sigmoid好? 1.5 为 ...

  2. 二阶矩阵转置怎么求_矩阵求导术(下)

    本文承接上篇 https://zhuanlan.zhihu.com/p/24709748,来讲矩阵对矩阵的求导术.使用小写字母x表示标量,粗体小写字母 表示列向量,大写字母X表示矩阵.矩阵对矩阵的求导 ...

  3. 矩阵求导术(上、下)

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 矩阵求导的技术,在统计学.控制论.机器学习等领域有广泛的应用.鉴于我看过的一些资料或言 ...

  4. 计算机系大神和数学系系花,小甜文:《一贱钟情,大神求放过》1v1双C,男主小奶狗,全程高甜...

    最近很多书迷都反应不知道看什么书好,不知不觉的就陷入了书荒的境地,作为老书迷的小编对此也感同身受.今天小编继续给书迷们介绍好看的小说,分分钟让书迷朋友们看上瘾不睡觉!看好的话记得收藏,不怕以后再书荒了 ...

  5. 神经网络中矩阵求导术的应用

    神经网络中矩阵求导术的应用 序 记法约定 常用公式和定理 举例 多层神经网络(MLP)的梯度推导 Batch Normalization Layer的推导 序 本文假设读者熟悉一元微积分,线性代数,并 ...

  6. 切面条/猜字母/大衍数列/奇怪的分式

    题目2.切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条.如果连续对折2次,中间切一刀,可以得到5根面条.那么,连续对折10次,中间切一刀,会得到多少 ...

  7. 蓝桥杯—切面条/大衍数列

    1.问题描述 1.一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条. 如果连续对折2次,中间切一刀,可以得到5根面条. 那么,连续对折10次,中间切一刀,会得 ...

  8. 【LeeCode】赛题02:Python解答大衍数列题目

    题目:大衍数列 中国古代文献中,曾记载过"大衍数列", 主要用于解释中国传统文化中的太极衍生原理. 它的前几项是:0.2.4.8.12.18.24.32.40.50 - 查看规律 ...

  9. 快速幂算法和大整数求模

    ** 1.快速幂的算法** (1)当我们求一个数的n次方的的结果时,若直接选择for循环,来累乘的话,效率很低,时间复杂度位O(n),而当我们选择快速幂来计 算时,时间复杂度能达到O(logn),快了 ...

最新文章

  1. 简单易学的深度学习算法:Wide Deep Learning
  2. 第三次学JAVA再学不好就吃翔(part57)--StringBuffer和String的相互转换
  3. ASP.NET MVC3 异步刷新
  4. equals 和 == 的区别?知乎转载
  5. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验
  6. JDBC连接sql server数据库
  7. python基础入门(3)之字符串
  8. SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查
  9. (十八)密度聚类DBSCAN
  10. CSS-Box模型--理解与整理
  11. Atitit 获取本机图像设备视频设备列表 设备检索列表解决方案
  12. eclipse java常用插件_高阶程序员必备25个最好的免费Eclipse插件
  13. 【数据结构实验】单链表实验
  14. ttest函数使用方法_TTEST 函数的学习方法(Excel)
  15. Vue官网下载Vue.js和Vue.min.js
  16. iOS设备分辨率 UI规范 以及适配
  17. 小牛电动Q2财报:国外不乐观,国内狂下沉
  18. Python初探(四,五)
  19. HDOJ(HDU) 1862 EXCEL排序(类对象的快排)
  20. cobol .cpy文件_Visual COBOL R3:“使传统的COBOL能够部署在JVM或.NET上”。

热门文章

  1. 牛腩新闻发布系统—如何发布
  2. python线程池抓取网页数据
  3. 2023 影视视频微信小程序源码 带支付和采集
  4. 重读《DOOM启世录》
  5. 杰理之FLASH-OTP区域使用方法【篇】
  6. matlab的自学笔记
  7. 《Spring揭秘》记录
  8. 江湖再见:毫米波雷达开发手册之行为识别应用
  9. pspice 的基础使用
  10. Java校验文件是否损坏