扩展欧几里得算法的使用及简单证明

Exgcd(拓展欧几里得算法)的初步理解 若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.针对于一次不定方程ax+by=c进行求解,利用以上的裴蜀定理可以进行求解,当然要满足 gcd(a,b)|c 这个前置情况这个时候实际上就是对于b*x+(a%b)*y=d(辗转相除法求得)a%b=a-(a/b)*b进行带入即可得到:a*y-b*(x-(a/b)*y)=d和原式ax+by=d对 阅读详情

一、简要介绍

扩展欧几里得算法(ExGcd)是基于传统欧几里得算法的实现,主要用于计算不定方程 a x + b y = gcd ⁡ ( a , b )   ( a , b ∈ Z ) ax+by=\gcd(a,b)\text{ }(a,b\in\mathbb{Z}) ax+by=gcd(a,b) (a,b∈Z) 的一组特殊整数解。类似于传统的欧几里得算法计算 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 时将 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 转化为 g c d ( b , a m o d    b ) gcd(b,a\mod b) gcd(b,amodb) ,扩展欧几里得算法通过类似的系数辗转相除法求出 x , y x,y x,y 的一组解。

如果我们不使用扩展欧几里得算法计算 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 这样一组不等式,则我们需要使用如下方法:
a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)
移项,得 a x = gcd ⁡ ( a , b ) − b y ax=\gcd(a,b)-by ax=gcd(a,b)−by
系数化为 1 1 1 ,得 x = gcd ⁡ ( a , b ) − b y a x=\large{\frac{\gcd(a,b)-by}{a}} x=agcd(a,b)−by​
由于在上面的方程中 y y y 未知,所以我们需要枚举每个可能的 y y y 值来搜索 x x x 的值。因此,若搜索范围为 [ l , r ] [l,r] [l,r] ,上面的算法时间复杂度将会达到 O ( r − l ) O(r-l) O(r−l) 。

但是,如果我们使用扩展欧几里得算法求解,我们将会很快得到 x , y x,y x,y 的值,总体的时间复杂度为 O ( log ⁡ ( r − l ) ) O(\log(r-l)) O(log(r−l)) 。下面,我们将会围绕 ExGcd 算法,介绍其使用前提,算法原理和相应的证明过程。

在本文中,所有 a   ∣   b a\text{ }|\text{ }b a ∣ b 的算式均表示 a a a 整除 b b b ,即 b m o d    a = 0 b\mod a=0 bmoda=0 。

二、扩展欧几里得算法的使用前提

该不定方程组为 a x + b y = gcd ⁡ ( a , b )   ( a , b ∈ Z ) ax+by=\gcd(a,b)\text{ }(a,b\in\mathbb{Z}) ax+by=gcd(a,b) (a,b∈Z) 的形式。

其实,这个条件也适用于判断一个形如 a x + b y = s ax+by=s ax+by=s 的方程是否有解。只需判断 s m o d    gcd ⁡ ( a , b ) s\mod\gcd(a,b) smodgcd(a,b) 是否等于 0 0 0 ,是则有解,否则无解。证明如下:

∵ a   ∣   g c d ( a , b ) ,   b   ∣   g c d ( a , b ) \because a\text{ }|\text{ }gcd(a,b),\text{ }b\text{ }|\text{ }gcd(a,b) ∵a ∣ gcd(a,b), b ∣ gcd(a,b) (最大公约数的定义),
又 ∵ x , y ∈ Z \because x,y\in\mathbb{Z} ∵x,y∈Z ,
∴ a x   ∣   gcd ⁡ ( a , b ) , b y   ∣   gcd ⁡ ( a , b ) \therefore ax\text{ }|\text{ }\gcd(a,b),by\text{ }|\text{ }\gcd(a,b) ∴ax ∣ gcd(a,b),by ∣ gcd(a,b) ,
∴ a x + b y   ∣   gcd ⁡ ( a , b ) \therefore ax+by\text{ }|\text{ }\gcd(a,b) ∴ax+by ∣ gcd(a,b) 。
∵ s = a x + b y \because s=ax+by ∵s=ax+by ,
∴ gcd ⁡ ( a , b )   ∣   s \therefore \gcd(a,b)\text{ }|\text{ }s ∴gcd(a,b) ∣ s ,
∴ s m o d    gcd ⁡ ( a , b ) = 0 \therefore s\mod\gcd(a,b)=0 ∴smodgcd(a,b)=0 (模运算的性质)。

因此,我们可以得到,只要方程 a x + b y = s ax+by=s ax+by=s 有解, s s s 一定满足 s m o d    gcd ⁡ ( a , b ) = 0 s\mod\gcd(a,b)=0 smodgcd(a,b)=0 。
也就是,扩展欧几里得算法对于所有有解的方程 a x + b y = s ax+by=s ax+by=s 均能得出一组特殊解。

三、扩展欧几里得的算法过程和证明以及代码演示

本部分的主要目标是求解方程 a x + b y = G  (1) ax+by=G\text{ (1)} ax+by=G (1) 的值。令 G = gcd ⁡ ( a , b ) G=\gcd(a,b) G=gcd(a,b) 。

假设我们已经求得一组解 x ′ , y ′ x',y' x′,y′ ,使得 b x ′ + ( a m o d    b ) y ′ = G  (2) bx'+(a\mod b)y'=G\text{ (2)} bx′+(amodb)y′=G (2) ,类似于 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) \gcd(a,b)=\gcd(b,a\mod b) gcd(a,b)=gcd(b,amodb) ,则我们可以联立 (1)(2) \text{(1)(2)} (1)(2) ,得到如下的方程组:
{ a x + b y = G (1) b x ′ + ( a m o d    b ) y ′ = G (2) \begin{cases} ax+by=G &\text{(1)}\\ bx'+(a\mod b)y'=G &\text{(2)} \end{cases} {ax+by=Gbx′+(amodb)y′=G​(1)(2)​
由于 G G G 已知,我们可以得到方程
a x + b y = b x ′ + ( a m o d    b ) y ′ ax+by=bx'+(a\mod b)y' ax+by=bx′+(amodb)y′
∵ a m o d    b = a − b ⌊ a b ⌋ \because a\mod b=a-b\lfloor\frac{a}{b}\rfloor ∵amodb=a−b⌊ba​⌋ ,
∴ \therefore ∴ 原方程可以化为
a x + b y = b x ′ + ( a − b ⌊ a b ⌋ ) y ′ ax+by=bx'+(a-b\lfloor\frac{a}{b}\rfloor)y' ax+by=bx′+(a−b⌊ba​⌋)y′
去括号,得
a x + b y = b x ′ + a y ′ − b y ′ ⌊ a b ⌋ ax+by=bx'+ay'-by'\lfloor\frac{a}{b}\rfloor ax+by=bx′+ay′−by′⌊ba​⌋
对于 b b b 合并同类项,得到
a x + b y = a y ′ + b ( x ′ − y ′ ⌊ a b ⌋ ) ax+by=ay'+b(x'-y'\lfloor\frac{a}{b}\rfloor) ax+by=ay′+b(x′−y′⌊ba​⌋)
由此,我们可以得到方程的一组解:
{ x = y ′ y = x ′ − y ′ ⌊ a b ⌋ \begin{cases} x=y' \\ y=x'-y'\lfloor\frac{a}{b}\rfloor \end{cases} {x=y′y=x′−y′⌊ba​⌋​
∴ \therefore ∴ 上述解是原方程的一组解。

循环往复,将系数替换再次求解,直到得到 a n = G ,   b n = 0 a_n=G,\text{ }b_n=0 an​=G, bn​=0 ,再将数据层层带回,得到 x , y x,y x,y 的一组解。

由此,我们可以得到扩展欧几里得算法的代码实现:

int x, y, xx, yy;

void ExGcd(int a, int b)
{
    if (b == 0) // 当 b = 0 时,到达递归出口,记录边界解,返回值,层层代入
    {
    	x = 1;
    	y = 0;
    	return;
    }
	
	ExGcd(b, a % b); // 求解方程 bx' + (a mod b)y' = gcd(a,b)
	xx = x, yy = y; // 备份原来的 x' 和 y'
	// 代入上面的解
	x = yy;
	y = xx - yy * (a / b);
	// 为了节省空间,此处也可以仅备份 x' 的值,因为 y' 的值会立刻赋值给 x 并且 y' 的值与 y 的值无关
}

// x, y 即为答案

三、实例应用和分析

原题链接:洛谷 P1052 同余方程

使用 ExGcd 的方法:
题目要求我们求以下方程组的解:
a x ≡ 1   ( mod  b ) ax≡1\text{ }(\text{mod } b) ax≡1 (mod b)
设有一个整数 y < 0 y < 0 y<0 ,且满足
a x = − b y + 1 ax=-by+1 ax=−by+1
则通过移项可以得到,
a x + b y = 1 ax+by=1 ax+by=1
通过上面的证明,我们可以得知 gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1
∴ a x + b y = gcd ⁡ ( a , b ) \therefore ax+by=\gcd(a,b) ∴ax+by=gcd(a,b) ,可以使用 ExGcd 算法求解。

本题需要解决的另外一个问题是如何求得最小的解。我们可以通过下面的方式:
设 p ∈ Z p \in\mathbb{Z} p∈Z ,则
a x + b y + p a b − p a b = 1 ax+by+pab-pab=1 ax+by+pab−pab=1
转化,可得
a ( x + p b ) + b ( y − p a ) = 1 a(x+pb)+b(y-pa)=1 a(x+pb)+b(y−pa)=1
通过调整 k k k 的值,可以确定 x x x 是最小的正整数解。
然而,此题不需要考虑这种情况也可以直接通过。

代码如下,注意由于 2 ≤ a , b ≤ 2 × 1 0 9 2 \le a,b \le 2\times 10^9 2≤a,b≤2×109 ,所以要开 long long 。

#include <bits/stdc++.h>

using namespace std;

long long a, b, x, y, xx, yy;

void ExGcd(long long a, long long b)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return ;
    }

    ExGcd(b, a % b);
    xx = x, yy = y;
    x = yy;
    y = xx - (a / b) * yy;
}

int main()
{
    cin >> a >> b;

    ExGcd(a, b);

    x = (x % b + b) % b;
    cout << x << endl;

    return 0;
}
扩展欧几里得算法(exgcd) 什么是扩展欧几里得算法? exgcd适用于处理一次不定方程的一个算法,可以求出不定方程的一组特解 例如可以用于求解:ax+by=k。给定a,b,k的值,便可以求出一组x,y的解 算法的实现 在exgcd中,我们实际是求不定方程ax+by=gcd(a,b),并且,我们所返回的值,是这组解(x,y)的最大公因数(gcd(x,y))。 所以我们最后得到的解,要通过X=x∗k/gcd(a,b),Y=(k−a∗x)/gcd(a,b)来进行一个小小的转换,得到一组解 下面对算法实现过程给出一个证明 我们通过递归,就可 阅读详情

相关推荐

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

扩展欧几里得算法的理解

这次看看数论的内容,之前本来想把这部分交给队员的,不过队员太忙了,还是我来看吧。。。 先回顾一下欧几里得算法和扩展欧几里得算法吧 欧几里得算法核心内容 gcd(a,b) = gcd(b,a % b) gcd(a,b) = gcd(b,a) a % 0 = a 简单证明a = b * c + r r = a % b 设 d 是 a,b最大公约数,则d也是a - b*c = r的约数,所

luke2834的专栏 582

CodeBuddy 接入 MCP,一键生成网站!

2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的”桥梁”,让开发者不用再为对接问题头疼了。mcp.so如下图所示,这是 mcp.so 网站中的 MCP Server。使用百度/高德地图分析旅线计算时间接 Puppeteer 自动操作网页使用 Github/Gitlab 让大模型接管代码仓库。

悟空聊架构的专栏 1945

数学知识(二)——欧拉函数、 快速幂、 扩展欧几里得算法、中国剩余定理

算法基础课第四章 数学知识(二). 共7题,知识点如下: 欧拉函数: AcWing 873. 欧拉函数、 AcWing 874. 筛法求欧拉函数。 快速幂: AcWing 875. 快速幂、 AcWing 876. 快速幂求逆元。 扩展欧几里得算法: AcWing 877. 扩展欧几里得算法、 AcWing 878. 线性同余方程。 中国剩余定理: AcWing 204. 表达整数的奇怪方式。

qq_44005993的博客 562

感应电机无速度传感器FOC控制原理与Simulink仿真实践

无速度传感器FOC控制是电机驱动领域的重要技术,通过算法重构实现仅依赖电气参数的闭环控制。其核心原理基于电机数学模型,利用Clark/Park变换和滑模观测器估算转子位置和转速。这种技术在工业伺服系统中具有显著价值,能有效降低系统成本并提高可靠性。典型应用场景包括纺织机械、风机驱动等需要精确转速控制的设备。本文以感应电机为例,详细解析了无感FOC的Simulink实现方法,特别关注滑模观测器设计和双闭环控制策略,为工程师提供可直接复用的参数调优经验。

weixin_29189987的博客 259

AD24-层次原理图的设计

4)在原理图关联对话框中双击需要放置方块图的子图,即激活方块图的放置,单击母图的空白处进行放置。3)设计-Create Sheet From Sheet,进入原理图关联对话框。4)放置-添加图纸入口,放置方块图的内部I/O端口并进行名称更改。2)放置-页面符,放置页面符,并执行Table完成属性设置。5)执行Ctrl+W,端口和内部I/O端口对应连接。1)创建一个工程并完成子图的每页原理图的设计。1)新建项目,创建Main原理图页。3)放置-的端口,放置方块图的端口。以上,就是层次原理图页的设计。

qq_52761962的博客 4917

算法中简单数学相关知识

5.同余与CRT EXCRT板子典例。1.线性筛欧拉函数板子。2.线性筛约数个数板子。3.线性筛约束和板子。4.欧拉函数板子典例。6.高斯消元板子典例。

m0_60921016的博客 119

【QT】基于QSerialPort的跨平台串口通信实战指南

本文是一份基于Qt QSerialPort模块的跨平台串口通信实战指南。详细介绍了从硬件基础、QSerialPort核心类使用、参数配置、设备自动发现到数据异步读写和错误处理的完整流程,并通过构建一个功能齐全的串口调试助手实例,帮助开发者快速掌握在Windows、Linux和macOS系统下进行高效、稳定的串口应用开发。

a1b2c3d的博客 981

扩展欧几里得算法(简单易懂,详细分析)

扩展欧几里得算法证明+应用 扩展欧几里得算法顾名思义是由欧几里得算法延伸出来的一个知识点,在搞懂扩展欧几里得算法之前不妨先来熟悉一下什么是欧几里得算法(又名辗转相除法) 欧几里得算法 1.应用:主要用于求解两个数a和b的最大公约数,我们不妨设(a>b),其公式为gcd(a,b)=gcd(b,a%b)=gcd(a%b,b%(a%b))=…=gcd(x,0),这里的x即为最大公约数. 2.下面展示代码: /*注意a>b,如果a<b交换一下位置即可*/ int gcd(int a,int b)

TheWayForDream 1万+

TSEND_C指令错误代码解析与实战排错指南

本文详细解析西门子PLC中TSEND_C指令的常见错误代码,包括连接建立、参数配置、资源限制和网络通信等错误类型。针对错误代码80C4等典型问题提供实战排错指南,帮助工程师快速诊断和解决工业通信中的连接故障,提升系统可靠性。

backprop5master的博客 411

【差分运放电路加偏置电压

摘要:该电路采用单电源供电运放(A3V3)处理双极性差分信号,通过1V直流偏置解决负半周信号削波问题。关键设计包括:15kΩ/10kΩ电阻分压建立1V基准,对称电阻网络实现2.5倍差分放大,0.1μF电容滤除电源噪声。适用于传感器信号调理(如电流采样、压力传感)和3.3V系统处理±0.5V交流信号,输出0-2.5V适配ADC输入。注意事项强调电阻匹配对共模抑制的重要性,以及电源滤波电容需靠近运放引脚布局。

qq_37999850的博客 561

扩展欧几里得算法(求逆元)

扩展欧几里得算法(求逆元)总结 1、在RSA算法生成私钥的过程中涉及到了扩展欧几里得算法(简称exgcd),用来求解模的逆元。 2、首先引入逆元的概念: 逆元是模运算中的一个概念,我们通常说 A 是 B 模 C 的逆元,实际上是指 A * B = 1 mod C,也就是说 A 与 B 的乘积模 C 的余数为 1。可表示为 A = B^(-1) mod C。 打个比方,7 模 11 的逆元,即:7^(-1) mod 11 = 8,这是因为 7 × 8 = 5 × 11 + 1,所以说 7 模 1.

zw201909250425的博客 2万+

手把手教你学Simulink——机器人力控场景实例:基于Simulink的永磁同步电机重力补偿力矩控制仿真

本文介绍了基于Simulink的机器人重力补偿力矩控制仿真方法。针对机器人悬停时电机发热、抖动等问题,提出通过前馈补偿重力转矩的解决方案。文章详细阐述了从机器人动力学建模、重力补偿计算、PMSM转矩控制到系统集成的完整实现流程,并以2-DOF机械臂为例验证了补偿效果。结果表明,重力补偿能显著降低电机电流和拖拽力,提高系统柔顺性。文中还提供了高级功能扩展方向,如参数辨识、摩擦补偿等,为实际工程应用提供了参考框架。

MHD0815的博客 154

扩展欧几里得算法的证明以及求逆元

在说扩展欧几里得算法之前,先说一下裴蜀定理。在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理: 若a,b是整数,且gcd(a,b) = d,那么对于任意的整数x,y,ax+by = m中的m一定是d的倍数。 一定存在整数x, y,使得 ax + by = gcd(a, b) 证明1:因为gcd(a, b) = d,所以d|a, d|b, 又因为x, y是整数, 所以d|ax, d|by, 所以d|ax+by, 即 d|m。 证明2:令s 为 ax + by 的最小正值,再令e = ma +

weixin_44060440的博客 1230

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

扩展欧几里得算法及贝祖定理的证明

欧几里得算法 公式表述:gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b) 证明: aaa 可以表示为 a=kb+r,r=a%ba = kb + r,r = a\%ba=kb+r,r=a%b 假设 ddd 是 (a,b)(a,b)(a,b) 的一个公约数,则有 d∣a,d∣bd|a,d|bd∣a,d∣b,而 r=a–kbr = a ...

L__ear的博客 3182

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

扩展欧几里得算法的证明

扩展欧几里得算法实际上就是对于ax+by=gcd(a,b),一定有一组整数解x,y使其成立 对于这个式子的证明,可以采用数学归纳法进行实现,先证明当n= 1时命题成立。 假设n=m时命题成立,那么可以推导出在n=m+1时命题也成立。(m代表任意自然数) 然后命题得证。 在这个式子里,也就是当b=0是一定成立,假设bx+(a%b)y=gcd(b,a%b)成立,证明ax+by=gcd(a,b)成立 实际上已知bx1+(a%b)y1=gcd(b,a%b)需要证明ax2+by2=gcd(a,b) 我们令a=kb+c

徒手拆机甲的博客 753

欧几里得算法,扩展欧几里得算法及裴蜀定理证明

最近小腐了一下数论,巩固了一些NOIP考察的数论基本知识。

Cold_Chair的博客 2256

扩展欧几里得算法详解

欧几里得算法,扩展欧几里得算法,欧几里得算法解二元一次方程组,欧几里得算法求乘法逆元。

点滴技术 1万+

扩展欧几里得算法

数论中的欧几里得及其证明,扩展欧几里得算法及其证明,代码实现,应用。

qq_34603425的博客 1111

严格证明扩展欧几里得算法的正确性

严格证明扩展欧几里得算法的正确性 引理一:\(m\mid x_i, i\in[1, k]\),则\(m\mid a_1x_1+\dots + a_kx_k, a_i\in Z\) ​ 证明:设\(mb_i=x_i\),则\(a_1x_1+\dots+a_kx_k=a_1mb_1+\dots+a_kmb_k=m(a_1b_1+\dots+a_kb_k),m \mid m(a_1b_1+\d...

496

数论——裴蜀定理、欧几里得算法、扩展欧几里得算法、逆元以及求解

a|b表示a整除b;a|\b表示a不整除b;|可以表示对整数的划分;

u014114223的博客 2107

【欧几里得算法以及扩展欧几里得算法】

假设有两个非负整数ab,并且ab都不等于0,那么ab的最大公约数等于其中较小的数和ab相除的余数的最大公约数。用公式表达为gcdabgcdbamodb)),其中a>=b。

xiangfeng666的博客 1186

扩展欧几里得算法(含严谨证明)

要整扩展欧几里得,我们肯定要学会欧几里得算法,如果你没有学过gcd(a,b)=gcd(b,a%b),那么打开这个链接:欧几里得算法 好了,如果你已经学完了欧几里得,那么就能默认你知道gcd(a,b)=gcd(b,a%b),那么什么是扩展欧几里得,就是对于ax+by=gcd(a,b),一定有一组整数解x,y(注意!不要用24和36这个例子卡我,x,y是整数,可以为负的!) 在证明之前,...

dfssbqyrq96616258的博客 430
上一篇: 多源最短路的两种做法和详细解析
下一篇: 递推、递归:将大目标分解为小目标的处理方法
Aobing_peterJr
博客等级 码龄2年 128粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值