数论知识点整理

数论
Java中BigInteger类的用法
1.add(); //大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a.add(b);
2.subtract(); //相减
3.multiply(); //相乘
4.divide();  //相除取整
5.remainder(); //取余
6.pow();  //pow(int)如果里面不是int无法执行
a.pow(b)=a^b
7.gcd();  //最大公约数
8.abs(); //绝对值
sum = sum.abs();
9.negate(); //取反数
10.mod(); a.mod(b) = a%b = a.remainder(b);
11.max();
12.min();
13.public int comareTo();
14.boolean equals(); //是否相等

费马小定理

若正整数 a 与素数 p 互质,则有 a^(p - 1) ≡ 1( mod p ) 。

欧拉定理

若正整数a , n互质,则a^φ(n)≡1(mod n) 其中φ(n) 是欧拉函数(1~n)与n互质的数。

欧拉定理的推论

若正整数a,n互质,那么对于任意正整数b,有:
a^b ≡ a^(b mod φ(n ))(mod n)

引理
对于任意互质的正整数a,n,满足:ax ≡1(mod n)最小的整数值X0是φ(n)的约数。
费马大定理
当n > 2时,关于x,y,z的方程xn+yn=z^n没有正整数解。
奇数列:a=2n+1, b= n2+(n+1)2-1, c= n2+(n+1)
偶数列:a= 2n ,b= n^2 -1 , c= n^2+1 。

模运算的运算规则

(a + b)  mod  p = (a  mod  p + b  mod  p)  mod  p      
(a - b)  mod  p = (a  mod  p - b  mod  p)  mod  p             
(a * b)  mod  p = (a  mod  p * b  mod  p)  mod  p              
a^b  mod  p = ((a  mod  p)^b)  mod  p                              
结合率
( (a+b)  mod  p + c)  mod  p = (a + (b+c)  mod  p)  mod  p 
( (ab)  mod  p * c) mod  p = (a * (b * c)  mod  p)  mod  p    
交换率: (a + b)  mod  p = (b+a)  mod  p                
               (a * b)  mod  p = (b * a)  mod  p                 
分配率:
((a +b) mod  p * c)  mod  p = ((a * c)  mod  p +(b
c)  mod  p)  mod  p 
重要定理:
若a≡b ( mod  p),则对于任意的c,都有(a + c) ≡ (b + c) ( mod p);
 若a≡b ( mod  p),则对于任意的c,都有(a * c) ≡ (b * c) ( mod p);
 若a≡b ( mod  p),则对于任意的c,都有ac≡ bc ( mod p);

唯一分解定理

一个数n肯定能被分解成  n=p1^a1 *  p2^a2 . . .*pn^an 
1.求出数n的因子个数

(1+a1)* (1+a2) * (1+a3) * (1+a4)…*(1+an)

2.求所有的因子之和
公式:
(q10+q11+q12…q1a1)(q20+q21+q22…q2a2)…*(qn0+qnn+qn2…qnan)

欧拉函数性质:

定理0:对于质数p,φ§ = p - 1。注意φ(1)=1.
定理一:设m与n是互素的正整数,那么
定理二:当n为奇数时,有。
因为2n是偶数,偶数与偶数一定不互素,所以只考虑2n与小于它的奇数互素的情况,则恰好就等于n的欧拉函数值。
定理三:设p是素数,a是一个正整数,那么=(p-1)*P^(a-1);
关于这个定理的证明用到容斥:
由于表示小于与互素数的正整数个数,所以用减去与它不互素的数的个数就行了。
那么小于与不互素数的个数就是p的倍数个数,有个。所以定理得证。

定理四:设为正整数n的素数幂分解,那么

这个定理可以根据定理一和定理三证明,其实用到的就是容斥。
定理五:设n是一个正整数,那么

这个其实可以看莫比乌斯反演就明白了。
定理六:设m是正整数,(a,m)=1,则:是同于方程的解。
定理七:如果n大于2,那么n的欧拉函数值是偶数。
定理八:小于N且与N互质的所有数的和是φ(n)*n/2。
威尔逊定理:
1.当且仅当p为素数时,( p -1 )! ≡ -1 ( mod p )
2.当且仅当p为素数时,( p -1 )! ≡ p-1 ( mod p )
3.若p为质数,则p能被(p-1)!+1整除
4.当且仅当p为素数时,p∣(p−1)!+1
杨辉三角:
typedef long long LL;
const int N = 60;
LL c[N][N];
void Count()
{
for (int i = 0; i < N; i ++)
c[i][0] = c[i][i] = 1;
for (int i = 1; i < N; i ++)
for (int j = 1; j <= i; j ++)
c[i][j] = c[i-1][j] + c[i-1][j-1];
}

第一类斯特林数

定理
第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目。
设P个人的编号为1,2,3,4…P,将P个人排成k个圆圈有两种情况:
1.在一个圆圈里只有编号为P的人,排法有S1(P-1,K-1)个。
2.P至少和另外一个人在一个圆圈里。这些排法可以通过把1,2…p-1排成k个圆圈,再把p放在1,2…p-1任意一个人的左边,因此,第二种类型的排法有(p-1)*S1(p-1,k)种做法
代码:
long long s[maxn][maxn]; //存放要求的第一类Stirling数
const long long mod = 1e9+7; //取模
void init()
{
memset(s , 0 , sizeof(s));
s[1][1]=1;
for (int i = 2; i <= maxn-1; i ++) {
for (int j = 1; j <= i; j ++) {
s[i][j]=s[i-1][j-1]+(i-1)*s[i-1][j];
if(s[i][j] >= mod)
s[i][j] %= mod;
}
}

【第二类斯特林数】
定理
第二类Stirling数S2(P,K)计数表示把P元素划分到k个不可区分的盒子里且没有空盒子的划分个数
代码:
long long s[maxn][maxn];//存放要求的Stirling数
const long long mod=1e9+7;//取模
void init()
{
memset(s,0,sizeof(s));
s[1][1]=1;
for ( int i = 2; i<= maxn-1; i ++) {
for(int j = 1; j <= i; j ++) {
s[i][j]=s[i-1][j-1] + j * s[i-1][j];
if(s[i][j] >= mod)
s[i][j] %= mod;
}
}
}

Bell数
Bell数B§B§是将p元素集合分到非空且不可区分盒子的划分个数(没有说分到几个盒子里面)。
代码实现:
int Bell[100][100];
void GetBell()
{
Bell[1][1] = 1;
for (int i = 2; i < 50; i++)
{
Bell[i][1] = Bell[i - 1][i - 1];
for (int j = 2; j <= i; j++)
Bell[i][j] = Bell[i][j - 1] + Bell[i - 1][j - 1];
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值