前言
本文介绍数论的相关知识,仅用于学习参考
一、数论究竟是什么?
数论是用来研究整数的性质的。
整数集 Z:{…−2,−1,0,1,2…}
自然数集N:{0,1,2,3,4…}
二、一些概念与定理
0. 质数
试除法:
bool is_prime(int x)
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ ) // 注意循环条件
if (x % i == 0)
return false;
return true;
}
1.最大公约数
存在一个整数d,使得d | x,d | y,则d为x,y的公约数。
最大的一个称之为最大公约数,记作gcd(x,y)。
辗转相除法
//递归写法
int gcd(int a,int b)
{
if(a%b==0)
return b;
return gcd(b,a%b);
}
//循环写法
int gcd(int a,int b)
{
int temp;
while(b)
{
temp = b;
b = a % b;
a = temp;
}
return a;
}
性质:
满足交换律:gcd(a,b) = gcd(b,a)
满足分配律:gcd(ma,mb) = m * gcd(a,b)
在乘法函数中:gcd(ab,m) = gcd(a,m) * gcd(b,m)
和最小公倍数(lcm)的关系:gcd(a, b) * lcm(a, b) = ab
两个整数的最大公因子和最小公倍数中存在分配律:
gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
2.算术基本定理
任意一个整数都能被分解为如下形式:
n=pk11pk22…pktt。其中p为质数。
t,∑ti=1ki都是logn量级的。
3.欧拉函数
欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1。
几个性质
4.扩展欧几里得
裴蜀定理:有任意正整数a与b,存在x和y,使得ax+by=gcd(a,b)
题型:根据欧几里得算法来求x与y(拓展欧几里得算法)
示例代码如下
#include<iostream>
using namespace std;
int exgcd(int a,int b,int & x,int & y)
{
if(!b)
{
x=1,y=0;
return a;
}
else{
int tmp_y;
exgcd(b,a%b,x,y);
tmp_y=y;
y=x-a/b*y;
x=tmp_y;
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b,x,y;
scanf("%d%d",&a,&b);
exgcd(a,b,x,y);
printf("%d %d\n",x,y);
}
}