首页 > 其他分享 >W.01 辗转相除法

W.01 辗转相除法

时间:2023-10-01 23:34:51浏览次数:29  
标签:mathbb exists W.01 带余 辗转 mid 除法 公因数

W.01 辗转相除法

提示:本文主要偏于数学证明.

[定义] 整除:
\(a,b\in \mathbb{N}\),若 \(\exists c\in \mathbb{N}\), 使得 \(a=bc\),称 \(b\) 整除 \(a\),记作 \(b\mid a\).

[定义] 带余除法:
\(a,b\in \mathbb{N}\),\(a>b\),则 \(\exists k,r\in \mathbb{N}\),使得 \(a=kb+r\) 且 \(r<a\)。称 \(r\) 是余数.

[定义]公因数:
\(a,b\in \mathbb{N}\),若 \(c\) 有 \(c\mid a\) 且 \(c\mid b\),称 \(c\) 是 \(a,b\) 的公因数.

[定义]最大公因数:
记全体 \(a,b\) 的公因数组成的集合为 \(S\),其中最大元素 \(c\) 称为 \(a,b\) 的最大公因数,记作 \((a,b)=c\).

[定理]
\(a,b\in \mathbb{N}\),\(a>b\),\(a=kb+r\)为其带余除法。则 \((a,b)=(r,b)\).

证明:

首先证明 \(c=(a,b)\) 是 \(r,b\) 的公因数.
由 \(c=(a, b)\) 知 \(c\mid a\) 且 \(c\mid b\).
也即 \(\exists n, m\in \mathbb{N}\),使得 \(a=nc\),\(b=mc\).
代入带余除法式子,\(nc=kmc+r\).
故 \(r=nc-kmc=(n-km)c\),推出 \(c\mid r\).
又由 \(c\mid b\) 知 \(c\) 是 \(r,b\) 的公因数.

然后证明 \(c\) 是 \(r,b\) 最大的公因数. 使用反证法:
若 \(\exists d>c\),\(d\mid r\) 且 \(d\mid b\).
有 \(\exists p, q\in \mathbb{N}\),使得 \(r=pd, b=qd\).
代入带余除法式子,\(a=kqd+pd=(kq+p)d\).
得到 \(d\mid a\).
又有 \(d\mid b\),故 \(d\) 是 \(a,b\) 的公因数.
由 \(c\) 是最大公因数知 \(d\leqslant c\),这与假设矛盾.

故 \((a,b)=(r,b)\). 得证.

[辗转相除法](下文 % 记号是 C++ 中运算符)

通过上面的定理,我们可以将求 \((a,b)\) 中一者降小,重复操作即可.

不妨看两个例子:

\((15,6)=(15\%6,6)=(3,6)=(3,6\%3)=(3,0)=3\).

\((8,5)=(8\%5,5)=(3,5)=(3,5\%3)=(3,2)=(3\%2,2)=(1,2)=(1,2\%1)=(1,0)=1.\)

可以看出带余除法是互相之间一直在辗转的,直到某一项为 \(0\) 为止.

[代码实现]

#include<iostream> 
using namespace std;
int main(){
	int a,b;
	cin>>a>>b;
	if(a<b)swap(a,b);
	while(b!=0){
	    a=a%b;
	    swap(a,b);
	}
	cout<<a;
} 

说明:每次让 a>b 是为了不讨论该谁去除谁得到余数的问题。

swap(a,b) 是一个操作(函数),能够交换 a,b 的值。

你可以用中间变量实现它,不过这样写更方便。

标签:mathbb,exists,W.01,带余,辗转,mid,除法,公因数
From: https://www.cnblogs.com/haraki/p/w01.html

相关文章

  • 高精度除法
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>div(vector<int>&A,int&b,int&r){vector<int>C;r=0;//r为余数for(inti=A.size()-1;i>=0......
  • 【模板】多项式乘法、乘法逆、除法、取模、常系数齐次线性递推
    以下代码必须开-O2#include<algorithm>#include<cassert>#include<cstdio>#include<cstring>#include<vector>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stderr,##__VA_ARGS__)#else#definedebug(...)void(0)#......
  • 用python求100到999以内的水仙花数(不用除法求各项)
    c=0forainrange(100,1000):forbinstr(a):a1=int(b)c=c+a1**3ifa==c:print(a)c=0输出结果为153370371407使用for循环来取数字中的每一位,不过数字要先化为str格式来取然后再化为int格式来赋值,要注意c的值每一次......
  • 辗转相除法--求最大公约数
    1.题目使用迭代,并通过辗转相除法求最大公约数2.代码////Createdbytrmbhon2023-09-13./*辗转相除法*///#include"stdio.h"intfun(intm,intn){intr;if(n>m)return(fun(n,m));elseif(n==0)returnm;else{r=m%n......
  • Java正整数除法向上取整
    1、简介在今天刷每日一题的时候看到的,感觉和以前自己写的向上取证的写法比起来好很多,在此记录。来源:1921.消灭怪物的最大数量-力扣(LeetCode)2、内容仅仅在正整数除法,三种都可用1、Math.ceil()2、x/y+(x%y==0?0:1)3、(x-1)/y+1classSolution{publicstaticvoidma......
  • 甄别考点排除法
    如下图,在核对答案的时候发现这样一个“出题规律”。综合四个选项,发现答案C、D有一定程度的相关性,如“软件”和“应用”,“互适应”和“互操作”等同义字眼。反推出以下信息:存在这样的选择题型,该类题硬核考察知识点,选项中有且只有两个选项存在同义表达。由于在书上看到过“......
  • P5629 【AFOI-19】区间与除法 题解
    P5629【AFOI-19】区间与除法题解由于题目中的运算是除法,所以对于一个数字\(x\),最多运算次数不会超过\(\lceil\log_{d}x\rceil\)就会变成\(0\)。然后我们就可以在\(O(n\logC)\)的时间复杂度内算出来每一个数字能被哪些原数消灭。这样处理询问仍然棘手,接下来有一个性质:......
  • 对数的本质是把乘除法降维成加减法
    最近看到这样一句话:“对数的本质就是降维,把乘法除法转化为加法和减法。”出于好奇,整理了本篇文章。对数和指数的概念对数在最简单的层面,对数解答以下问题:多少个既定的数相乘会等于另一个数?例子:多少个2相乘会等于8?答案:2×2×2=8,所以需要把3个2相乘来得到......
  • Java 运算符 - 除法
    1.除法运算符Java中的除法运算符是“/”符号,表示将左侧操作数除以右侧操作数。2.整数除法在Java中,整数除法的结果是一个整数,即只保留除法的整数部分,舍去小数部分。例如,7/2的结果是3,而不是3.5。3.浮点数除法如果操作数中至少有一个是浮点数,则Java会执行浮点数除法,结果为一......
  • 5.8 汇编语言:汇编高效除法运算
    通常情况下计算除法会使用div/idiv这两条指令,该指令分别用于计算无符号和有符号除法运算,但除法运算所需要耗费的时间非常多,大概需要比乘法运算多消耗10倍的CPU时钟,在Debug模式下,除法运算不会被优化,但Release模式下,除法运算指令会被特定的算法经过优化后转化为为乘法,这样就可以提高......