数论学习笔记

注:此文章只为记下在数论学习中的点点滴滴(同时也通过这篇文章来催促我好好学数学),不定期更新(请各位不要D我,我是从初等数论学起的)
再注:本文章用了大量的数学公式,如果显示不全请刷新再试。
大部分是我的读书(《青少年信息学奥林匹克竞赛实战辅导丛书——数学与程序设计(C++版)》)笔记

整除

有问题,找百度。传送门
补充一条性质:
若有整数 x,y 满足下式 ax+by=1 ,且 a|nb|n ,那么 (ab)|n
大致证明: (ab)|(bn)(ab)|(an) —>
(ab)|(anx+bny) —>
(anx+bny)=n(ax+by)=n —>
(ab)|n
一些有用的例子:若2能整除a的最末位(约定0可以被任何数整除),则 2|a ;若4能整除a的最后两位,则 4|a ;若8能整除a的最后三位,则 8|a ……(可以类比),若3能整除a的各位数字之和,则 3|a ;若9能整除a的各位数字之和,则 9|a ;若11能整除a的偶数位数字之和与奇数位数字之和的差,则 11|a 。能被7、11、13整除的数的特征是:这个数的末三位与末三位以前的数字所组成的数的差能被7、11、13整除(也可类比)(读者自证,不要想复杂)(注:“、”=或)

勾股数

x2+y2=z2 x,y,z 为一组勾股数,且 x,y,z 满足 x=2mn,y=m2n2,z=m2+n2
性质:
(1) x,y,z 一定两两互质(只是一般限定,人为认为3、4、5与6、8、10为本质相同的勾股数)。
(2) x,y 一定一奇一偶。
(3) x+z 一定是一个完全平方数。
(4) (y+z)/2 也是一个完全平方数。
(5) xyz 一定能被60整除。

附一道奇怪的题:

问题描述
对于给定的 n ,从 1! 2! 3! n! 中至少删去几个数,才可以使剩下的数的乘积为完全平方数?
输入格式
仅一行,包含一个整数 n 1n500
输出格式
第一行是一个整数 k ,表示最少需要删去的数的个数。
接下来一行,是从小到大排列的 [1,n] 之间的 k 个整数,表示一种删数的方案,若有多组解,则输出字典序最小的一组。
提示
初看本题,貌似是一道几乎不可解的 NP 问题,但由于有一个重要结论:最多只会去掉3个数,便可使剩下的数的乘积为完全平方数(至今我都不明白,哪位神犇若证了出来,请在评论里发表一下吧)。于是本题可以用穷举法在 O(n2log2n) 内解决。

同余

概念及性质问题就去问百度吧讲得挺明白的传送门
补充一条极其偏的性质:
a mod p=x a mod q=x pq 互质,则 a mod (pq)=x
大致证明: a=sp+xa=tq+x —>
sp=tq —>
s=rq —>
a=rpq+x —>
a mod (pq)=x

上吧,快速幂(顾名思义,快速计算 ab mod p )。

long long quick_pow(long long a,long long b,long long p)
{
    long long ans = 1;
    for (;b;a=(a*a)%p,b>>=1)
        if (b&1)
            ans=(ans*a)%p;
    return ans;
}

网上种种关于快速幂的介绍和原理已经天花乱坠,我就不多此一举去介绍了。

威尔逊定理

P 为素数,则 (P1)!P1(mod P)
威尔逊定理的逆定理也成立:若对某一正整数 P ,有 (P1)!P1(mod P) ,则 P 一定为素数。
(P1)!+1 一定是 P 的倍数,所以再利用正弦函数的特点,构造出一个素数分布的函数曲线 f(n)=sin(π((n1)!+1)/n) 。函数值为 0 的点都是素数所在的点。

费马小定理

费马小定理和欧拉定理的证明
P 为素数, a 为正整数,且 a P 互质,则 aP11(mod P)
其实这是一种特殊情形,一般情况下,若 P 为素数,则 aPa(mod P)
费马小定理的一个应用: MillerRabin 概率素数判断算法
我们选取若干个 a ,都满足费马小定理的话,几乎可以肯定 P 是素数。尽管不能完全确定,但在实际操作中是可行的。假如随机选取的 4 个数为 2,3,5,7 ,则在 2.51013 以内判断唯一失误的数为 3215031751

bool Miller_Rabin(int n)
{
    if (n==2) return 1;
    const int count=10;//随机挑选count个数
    for (int i=1;i<=count;++i)
    {
        int a=rand()%(n-2)+2;
        if (quick_pow(a,n,n)!=a) return 0;//用到快速幂了
    }
    return 1;
}

由于随机数会导致可能判断失误,所以在实际操作中应人为的选定某几个数以使误判的可能性尽量减小:

bool check_prime(long long n)
{
    int a[6]={2,3,5,7,11,13};
    if (n==1) return 0;
    for (int i=0;i<6;++i) if (n==a[i]) return 1;
    for (int i=0;i<6;++i)
        if (quick_pow(a[i],n-1,n)!=1) return 0;
    return 1;
}

欧拉定理

费马小定理是用来阐述在素数模下,指数的同余性质。当模是合数时,就要应用范围更广的欧拉定理了。
(1)欧拉函数
n 为正整数,欧拉函数 φ(n) 定义为不超过 n ,且与 n 互质的正整数的个数。
(2)引理1
①如果 n 为某一个素数 p ,则: φ(p)=p1
②如果 n 为某一个素数 p 的幂次 pa ,则 φ(pa)=(p1)pa1
③如果 n 为任意两个互质的数 a,b 的积,则 φ(ab)=φ(a)φ(b)
④特殊性质:当n为奇数时, φ(2n)=φ(n)
十分草率的证明:
①显然
②比 pa 小的数有 pa1 个—>
其中能被 p 整除的数可以表示为 pt(t=1,2, ,pa11) —>
共有 pa11 个这样的数能被 p 整除,从而不与 pa 互质—>
φ(pa)=pa1(pa11)=(p1)pa1
ab 互质,设 m a 互质, n b 互质, x ab 互质—>
根据剩余定理,关于未知量 x 的方程组 x mod a=m , x mod b=n ,当 0<x<mn 时存在并且仅存在一个解—>
如果两个这样的方程组有相同的 ab 但是 mn 不同,那么他们的解 x 一定不同。(以上都可以由剩余定理证明)—>
所以共有多少对不同的 m,n 就有多少个不同的 x 所以 φ(ab)=φ(a)φ(b)
④与③的证明基本神似(一模一样……)
(3)引理2
pa11pa22...pakk 为正整数 n 的素数幂表达式(标准分解式),则:
φ(n)=n(11/p1)(11/p2)...(11/pk)
又是一个草率的证明:
由于诸素数幂之间是相互互质的,根据引理1得出:
φ(n)=φ(pa11)φ(pa22)...φ(pakk)
=pa111(p11)pa212(p21)...pak1k(pk1)
=pa11(11/p1)pa22(11/p2)...pakk(11/pk)
=pa11pa22...pakk(11/p1)(11/p2)...(11/pk)
=n(11/p1)(11/p2)...(11/pk)
其余性质:
φ(n)=φ(n/p)p (p|n and p|np)
φ(n)=φ(n/p)(p1) (p|n and pnp)
关于⑤⑥的证明利用欧拉函数的公式就可得。
(4)欧拉定理
a m 互质,则 aφ(m)1(mod m)

φ(n) O(n) )
直接上代码。

int euler_phi(int n)
{
    int m=(int)sqrt(n+0.5);
    int ans=n;
    for (int i=2;i<=m;++i)
        if (n%i==0)
        {
            ans=ans/i*(i-1);
            while (n%i==0) n/=i;
        }
    if (n>1) ans=ans/n*(n - 1);
    return ans;
}

另一种理解:

int euler_phi(int n)
{
    int ans=1;
    for(int i=2;i*i<=n;++i)
        if (n%i==0)
        {
            n/=i;
            ans*=i-1;
            while (n%i==0) 
            {
                n/=i;
                ans*=i; 
            }
        }
    if (n>1) ans*=n-1;
    return ans;
}

附一道题:

输入 n ,输出 n! 的位数。

结论: i=1nlog10i+1=i=1nlniln10+1 。(原理: log10ab=log10a+log10b

Catalan数

百科传送门
递归公式:(Catalan数记作 Cn
Cn=i=0n1Ci+Cni1 C0=1
组合公式1:
Cn=Cn2nn+1
组合公式2:
Cn=Cn2nCn12n

卡特兰数应用很多,如:二叉树形态的计数、乘法添括号、火车进站、合法的出栈序列计数、欧拉多边形分割问题等。

级数求和

以下部分公式证明方法:数学归纳法
1+2+3+...+n=k=1nk=n(n+1)/2=C2n+1
12+22+32+...+n2=k=1nk2=n(n+1)(2n+1)/6
13+23+33+...+n3=k=1nk3=n2(n+1)2/4
1+3+5+7+...+(2n+1)=(n+1)2
1+2+4+...+2n=2n+11
k=0xk=11x ,其中 |x|<1
k=0nxk=xn+11x1 ,其中 x1
n=0xnn!=1+x+x22!+x33!+...+xnn!+...=ex
e=limn1+11!+12!+13!++1n! (上式令 x=1 即可得到)
112+123+134+145+...+1n(n+1)=11n+1
1p=1p+1+1p(p+1)
π=4(113+1517+19+...+(1)n1(2n1)2+...)
(利用 tan1x=n=0(1)n2n+1x2n+1 ,令 x=1

m 次方求和公式(原文By Lcomyn)
数论学习笔记_第1张图片

高斯消元

请移步此处

其它奇怪的知识

循环小数转分数:
对于一个循环小数 0.a1a2a3...ai(ai+1ai+2...ai+j) 其中括号内的为循环节,则生成方法:
数出循环节包含的数字个数,记为 a ;(即例子中的 j
数出循环节前的数字个数,记为 b ;(即例子中的 i
记小数点后第一个数字到循环节的最后一个数字为 x ;(即例子中的 a1a2a3...aiai+1ai+2...ai+j
记小数点后第一个数字到循环节前的第一个数字为 y ;(即例子中的 a1a2a3...ai
则该循环小数可以写为 (xy)/(10a+b10b)
一个栗子: 0.654(1239) ,则 a=4 b=3 x=6541239 y=654
所以原数 =(6541239654)/(107103) ,注意要再约分。

一个鲜为人知的性质尽管我不确定是否鲜为人知,反正书上这么写的):
如果数 N p 个除数,则所有这些除数的乘积等于 Np (随便写写就知道了)

你可能感兴趣的:(学习笔记)