【定义】 对于,若是有
使得
,则称
整除
,记为
.ios
关于整除有以下结论:算法
【定义】 全部同时整除和
的整数中,最大的那个,称为
和
的最大公因子,记为
,也可记为
.函数
【引理】 设,这里
,则
.测试
证实:因为
,全部
和
的公因子同时整除
和
,因此也能整除
,因此也是
和
的公因子。因为
,全部
和
的公因子同时整除
和
,因此也能整除
,因此也是
和
的公因子。也就是说,
和
的公因子,
和
的公因子是同一拨,那么
和
的公因子中最大的那个,
和
的公因子中最大的那个 固然是同一个了。 因此
。ui
欧几里德算法又称展转相除法,是指用于计算两个正整数和
的最大公因子。证实过程主要依据上面的引理
。spa
代码实现以下:code
#include<algorithm>
#include<iostream>
/* 欧几里德算法:展转求余 原理: gcd(a,b)=gcd(b,a mod b) 当b为0时,两数的最大公约数即为a */
int gcd(int a, int b){
if (a < b){
std::swap(a, b);
}
if (0 == b){
return a;
}else{
return gcd(b, a % b);
}
}
// 简单测试
int main() {
int t = gcd(10,25);
std::cout<<t;
}
复制代码
【定义】 对于,咱们称
为
的整系数线性组合,并用
表示它们构成的集合。数学
【扩展欧几里得算法】 设和
是两个正整数(至少有一个非零),
,则存在整数
和
使得
成立,若是
和
都是素数,那么存在整数
和
使得
成立。string
代码实现:it
def egcd(a,b):
if 0 == b:
return a,1,0
gcd,k1,k2 = egcd(b, a%b)
return gcd,k2,k1-a/b*k2
复制代码
最大公因子的最小可能取值是,当
,即
和
的最大公因子为
时,咱们称
和
互素。
当时,有时候咱们很但愿求得一个数
,
,使
,这样的数咱们称为
的乘法逆元, 这看起来就像是在
到
这些整数中找到
的倒数同样。那怎么找到这样的数呢?
扩展欧几里得算法能够帮咱们解决这个问题。
因为,根据扩展欧几里得算法,可求得两个系数
和
,使得
,因此有
,因此
,因此
,而
,因此
就是咱们想要的那个乘法逆元。
【算数基本定理(整数的惟一分解定理)】任何大于的整数
可表示成有限个(可重复)素数的乘积,并且不计乘积中因子顺序时分解仍是惟一的。
根据算数基本定理,大于的整数
惟一地表示成
的形式,这里
为不一样素数,
,咱们称这样的形式为
的标准(素数)分解式。
对任意一个正整数,在
到
的这 个整数里,显然有些和
是互素的,而有些和
是不互素的,那些和
互素的整数 的数量就是
的欧拉函数,记做
。
那么该怎么计算呢?
咱们都知道任意整数均可以表示成它的全部素因子的乘积:
因此全部那些和不互素的数,必定和
有其中某个素因子做为公共因子。因此咱们只要从
到
中的全部整数中,是
的倍数的依次剔除,剩下的就是与
互素的数。
例如,的倍数一共有多少个呢,因为
的倍数在
到
中是均匀分布的,因此占据的比例是
,剔除
的倍数后,还剩下
个;在剩下的数中,因为
的倍数在
到
中也是均匀分布的,因此占据的比例是
,因此再剔除
的倍数后,剩下
个。以此类推,当把全部素因子的整数倍都剔除后,剩下的数共有
个。即:
$
因而可知,求欧拉函数的关键在于求出的全部素因子,即对
作素因子分解。
有一种特殊状况,为素数,那么
仅有一个素因子,即它本身。此时
。
还有一种特殊状况,仅有两个素因子,即
,那么
。若是已知
和
,显然
是好求的;而若是仅知道
,而不知道
和
,那么必需要先对
作素因子分解,获得
和
,才能求得
。
若是这两个素因子都极大,那么固然
也就极大。要从
到
这
个数中找出这两个素因子,就如同大海捞针,复杂度极高。
古希腊数学家丢番图首次系统地研究了方程的整数解问题,如今涉及整数解的方程都叫作丢番图方程,也叫不定方程。
丢番图方程,又称不定方程,是未知数只能使用整数的整数系数多项式等式;即形式如的等式,而且其中全部的
,
和
均是整数。若其中能找到一组整数解
,
者则称之为有整数解。线性丢番图方程为线性整数系数多项式等式,即此多项式为次数为
或
的单项式的和。
【定理】设,则线性丢番图方程
有整数解当且仅当
.
对任何整數和
,关于未知数
和
的线性丢番图方程(称为贝祖等式):
.有整数解时当且仅当
是
和
的最大公约数
的倍数,即
.