几个数论知识

递推的推导错排公式

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
综上得到
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.

1、本原勾股数:

概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2

首先,这种本原勾股数的个数是无限的,而且构造的条件满足:

a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2

其中s>t>=1是任意没有公因数的奇数!

由以上概念就可以导出任意一个本原勾股数组。

 

2、素数计数(素数定理)

令π(x)为1到x中素数的个数

19世纪最高的数论成就就是以下这个玩意儿:

lim(x->∞){π(x)/(x/ln(x))}=1

数论最高成就,最高成就!!!有木有!!!

 

3、哥德巴赫猜想(1+1)

一个大偶数(>=4)必然可以拆分为两个素数的和,虽然目前还没有人能够从理论上进行证明,不过我根据科学家们利用计算机运算的结果,如果有一个偶数不能进行拆分,那么这个偶数至少是一个上百位的数!!

所以在ACM的世界中(数据量往往只有2^63以下)哥德巴赫猜想是成立的!!所以拆分程序一定能够实现的

 

4、哥德巴赫猜想的推广

任意一个>=8的整数一定能够拆分为四个素数的和

证明:

先来说8=2+2+2+2,(四个最小素数的和)不能再找到比2小的素数了,所以当n小于8,就一定不可能拆分为四个素数的和!

那么当n大于等于8,可以分情况讨论:

(1)n&1==0(n为偶数),那么n就一定可以拆分为两个偶数的和

那么根据哥德巴赫猜想,偶数可以拆分为两个素数的和,于是,n一定可以拆分为四个素数的和

(2)n&1==1(n为奇数),n一定可以拆分为两个偶数+1

由于有一个素数又是偶数,2,那么奇数一定有如下拆分:2+3+素数+素数

得证。

 

5、欧拉函数(欧拉公式)

欧拉函数ph(n)的意思是所有小于n且与n互质的数的个数

比如说ph(12)=4,[1,5,7,11与12互质]

欧拉公式

a^ph(m)=1(mod m)

 

6、费马小定理

费马小定理是欧拉公式的一种特殊情况

由于当p为质数的时候ph(p)=p-1这是显然的

那么带入欧拉公式就得到了费马小定理

a^(p-1)=1(mod p)

p为质数(prime)

 

7、抽屉原理

抽屉原理其实是废话,关键在于运用

这句废话是说,如果现在有3个苹果,放进2个抽屉,那么至少有一个抽屉里面会有两个苹果,这个很废话。

 

8、抽屉原理的运用

抽屉原理本身只是一句废话,不过他的运用却非常强大

现在假设有一个正整数序列a1,a2,a3,a4.....an,试证明我们一定能够找到一段连续的序列和,让这个和是n的倍数,该命题的证明就用到了抽屉原理

我们可以先构造一个序列si=a1+a2+...ai

然后分别对于si取模,如果其中有一个sk%n==0,那么a1+a2+...+ak就一定是n的倍数(该种情况得证)

下面是上一种情况的反面,即任何一个sk对于n的余数都不为0

对于这种情况,我们可以如下考虑,因为si%n!=0

那么si%n的范围必然在1——(n-1),所以原序列si就产生了n个范围在1——(n-1)的余数,于是抽屉原理就来了,n个数放进n-1个盒子里面,必然至少有两个余数会重复,那么这两个sk1,sk2之差必然是n的倍数,

而sk1-sk2是一段连续的序列,那么原命题就得到了证明了

 

9、判断n!是否能够被m整除

计算方法是把m进行质因数分解,看下m的每一个质因数是否能够在n!中找到;

n!中间包含了多少个x(x是任意的一个数,不过一般情况下我们都只讨论x为质数),这种问题的答案是:
n/x+n/(x^2)+n/(x^3).....[一直加到x的乘方不超过n],这个定理的证明也非常的简单,这里就不再赘述了

根据以上观点,就可以分别计算m的每一个质因数是否被完全包含,如果有一个没有被包含,那么就不能被整除!

 

10、因子和的计算方法

神马叫因子和:一个数的所以因子的和就叫因子和。。。

好吧,举个例子:12的因子和为:1+2+3+4+6+12

计算方法是把12分解为质因数的表达形式2^2*3

那么他的因子和就是:(1+2+2^2)*(1+3)

证明写起来比较麻烦,大体上思路就是牛顿二项式。。。

 

11、判断组合数C(n,m)的奇偶性

有一个我也不知道证明的方法

当n&m==m为奇数,反之就是偶数


//辗转相除法,求解a,b的最大公约数:
int gcd(int a,int b){
    return b == 0 ? a:gcd(b,a%b);
}//最小公倍数为:a/gcd(a,b)*b; 先除后乘。

//筛选法构造1~n的素数表:(筛选完毕,还没有被删除的即为素数)
int vis[N],prime[N];
int m=sqrt(n+0.5);int c=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;i++)
    if(!vis[i]){
        prime[c++]=i;
        for(int j=i*i;j<=n;j=j+i) vis[j]=1;
    }//vis中为0的即为素数,其中素数又保存在了prime数组中!c为素数总数。

//大整数取模:返回值为取模后的值
int mod(char *n,int m){
    int len=strlen(n); int ans=0;
    for(int i=0;i<len;i++){
        anx = (int)(((long long)ans*10+n[i]-'0')%m);
    }
    return ans;
}

//幂取模:(利用分治法)求a^n对m取模的运算---时间复杂度为 O(log(n));
int mod(int a ,int n,int m){
    int x=mod(a,n/2,m);
    long long ans=(long long)x*x%m;
    if(n%2) ans=ans*a%m;
    return (int)ans;
}

 

//n个人中选择m个的方法总数
double zuhe(int n,int m) //从n中选m,不排序
{
 double s=1,i;
 for(i=0;i<m;i++)
  s=s*(n-i)/(i+1);
 return s;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值