数论——算数基本定理、欧几里得算法、丢番图方程

整除

【定义】 对于a,b \in Z,若是有q \in Z使得aq=b,则称a整除b,记为a|b.ios

关于整除有以下结论:算法

  • c=k_1a+k_2be|a,且e|b,则e|c.

最大公因子

【定义】 全部同时整除ab的整数中,最大的那个,称为ab的最大公因子,记为 (a,b),也可记为gcd(a,b).函数

【引理】 设a=bq+c,这里a,b,c,q\in Z,则(a,b)=(b,c).测试

证实:因为a=bq+c,全部bc的公因子同时整除bc ,因此也能整除a,因此也是ab的公因子。因为c=a-bq,全部ab的公因子同时整除ab ,因此也能整除c,因此也是bc的公因子。也就是说,ab的公因子,bc的公因子是同一拨,那么ab的公因子中最大的那个,bc的公因子中最大的那个 固然是同一个了。 因此(a,b)=(b,c)ui

欧几里得算法

欧几里德算法又称展转相除法,是指用于计算两个正整数ab的最大公因子。证实过程主要依据上面的引理(a,b)=(b,c)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;
}
复制代码

扩展欧几里得算法

【定义】 对于a_1,\cdots,a_n\in Z,咱们称a_1x_1+ \cdots + a_nx_n(x_1,\cdots,x_n\in Z)a_1,\cdots,a_n的整系数线性组合,并用a_1Z+\cdots+a_nZ表示它们构成的集合。数学

【扩展欧几里得算法】 设ab是两个正整数(至少有一个非零),d=gcd(a,b),则存在整数xy使得ax+by=d成立,若是ab都是素数,那么存在整数xy使得ax+by=1成立。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
复制代码

互素

最大公因子的最小可能取值是1,当(a,b)=1ab的最大公因子为1时,咱们称ab互素。

乘法逆元

(a,b)=1时,有时候咱们很但愿求得一个数k0\leq k \lt b,使ka\ mod\ b=1 ,这样的数咱们称为a的乘法逆元, 这看起来就像是在0b-1这些整数中找到 a的倒数同样。那怎么找到这样的数呢?

扩展欧几里得算法能够帮咱们解决这个问题。

因为(a,b)=1,根据扩展欧几里得算法,可求得两个系数k_1k_2,使得k_1a+k_2b=(a,b)=1,因此有k_1a=-k_2b+1,因此k_1a\ mod\ b=1 ,因此(k_1\ mod\ b)a\ mod\ b=1,而0\leq(k_1\ mod\ b)\lt b,因此(k_1\ mod\ b)就是咱们想要的那个乘法逆元。

算数基本定理

【算数基本定理(整数的惟一分解定理)】任何大于1的整数n可表示成有限个(可重复)素数的乘积,并且不计乘积中因子顺序时分解仍是惟一的。

根据算数基本定理,大于1的整数n惟一地表示成p_1^{a_1}\cdot \cdots \cdot p_r^{a_r}的形式,这里p_1<\cdots<p_r为不一样素数,a_1,\cdots,a_r\in{Z^{+}},咱们称这样的形式为n的标准(素数)分解式。

欧拉函数

对任意一个正整数n,在1n的这 个整数里,显然有些和n是互素的,而有些和n是不互素的,那些和n互素的整数 的数量就是n的欧拉函数,记做\phi(n)

那么\phi(n)该怎么计算呢?

咱们都知道任意整数n均可以表示成它的全部素因子的乘积:

n=p_1^{l_1}p_2^{l_2}\cdots p_s^{l_s}\tag{1}

因此全部那些和n不互素的数,必定和n有其中某个素因子做为公共因子。因此咱们只要从1n中的全部整数中,是p_1,p_2,\cdots,p_s的倍数的依次剔除,剩下的就是与n互素的数。

例如,p_1的倍数一共有多少个呢,因为p_1的倍数在1n中是均匀分布的,因此占据的比例是\frac{1}{p_1},剔除p_1的倍数后,还剩下n(1-\frac{1}{p_1})个;在剩下的数中,因为p_2的倍数在1n中也是均匀分布的,因此占据的比例是\frac{1}{p_1},因此再剔除 p_2的倍数后,剩下n(1-\frac{1}{p_1})(1-\frac{1}{p_2})个。以此类推,当把全部素因子的整数倍都剔除后,剩下的数共有n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots (1-\frac{1}{p_s})个。即:\phi(n) = n\prod_{i=1}^{s}(1-\frac{1}{p_s}) \tag{2}$

因而可知,求欧拉函数的关键在于求出n的全部素因子,即对n作素因子分解。

有一种特殊状况,n为素数,那么n 仅有一个素因子,即它本身。此时\phi(n)=n(1-\frac{1}{n})=n-1

还有一种特殊状况,n仅有两个素因子,即n=pq,那么\phi(n)=pq(1-\frac{1}{p})(1-\frac{1}{q})=(p-1)(q-1)。若是已知pq,显然\phi(n)是好求的;而若是仅知道n,而不知道pq,那么必需要先对n作素因子分解,获得pq,才能求得\phi(n)

若是这两个素因子p,q都极大,那么固然 n也就极大。要从1nn个数中找出这两个素因子,就如同大海捞针,复杂度极高。

丢番图方程

古希腊数学家丢番图首次系统地研究了方程的整数解问题,如今涉及整数解的方程都叫作丢番图方程,也叫不定方程。

丢番图方程,又称不定方程,是未知数只能使用整数的整数系数多项式等式;即形式如a_1x_1^{b_1} + a_2x_2^{b_2}+\cdots +a_nx_n^{b_n}=c的等式,而且其中全部的a_j,b_jc均是整数。若其中能找到一组整数解m_1,m_2\cdots m_n者则称之为有整数解。线性丢番图方程为线性整数系数多项式等式,即此多项式为次数为01的单项式的和。

【定理】设a_1,\cdots,a_n,b\in Z,则线性丢番图方程a_1x_1+a_2x_2+\cdots+a_nx_n=b有整数解当且仅当(a_1,\cdots,a_n)|b.

贝祖等式

对任何整數a,bm,关于未知数xy的线性丢番图方程(称为贝祖等式):ax+by=m.有整数解时当且仅当mab的最大公约数d的倍数,即(a,b)|m.

相关文章
相关标签/搜索