Java教程

数论补全计划【蒟蒻数论乱证】

本文主要是介绍数论补全计划【蒟蒻数论乱证】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

写在前面

55然而我太逊了所以虎哥讲数论的时候一直把数论的费马小定理什么都都咕着,导致我现在学组合数取模啥都不会,所以就有了这个计划

虎哥写的blog比我写的好多了,而且贼全,我就自己重复证一证加深印象⑧

虎哥的blog✌

奇怪怪我不会LATEX。。。那我就这么着打吧

我就瞎整了奥

逆元

当gcd(a,b) == 1即a与b互质时,存在乘法逆元:

a ∗ x ≡ 1 (mod b)

证明:

(a÷b)%p ≠ ( (a%p)÷(b%p) )%p,这个让人觉得很烦,有一天就有数学家想解决这个问题。

 

当(a÷b)%p = m

 

假设存在 (a×x)%p = m

 

对于第个柿子,在两边都乘上一个b:

 

a%p = ( m×(b%p) )%p

 

如果a<p && b<p,那就有:

 

a = (m×b)%p

 

然后再在两边乘上x

 

(a×x)%p = (m×b×x)%p

 

然后一看,这左边的柿子真真的熟悉,然后看最开始咱假设那个,然后就发现了神奇的东西

 

m = (m×b×x)%p

//(a×x)%p = m = (m×b×x)%p

 

把两边的m一消:

 

(b×x)%p = 1

 

就称x是b在%p意义下滴逆元,x记作b-1

“证毕”

嗐 所以咱就看到,想求(a÷b)%p 也就是求(a×x)%p

然后咋求逆元的话。。。我把虎哥的线性求逆元代码粘过来吧

 

%%%虎哥的证明%%%

 

虎哥的代码
// 因为 1<i<p,所以 p/i 一定小于 p
ny[1] = 1;
for (int i = 2; i < p; ++i) {
    ny[i] = (long long)(p - p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘记
}

然后我顺便解释解一下虎哥证明中那个i×i-1 = 1(在证明里边乘1不变所以虎哥消了)

咱知道那逆元的定义是 x 是 a 在 %p 意义下的逆元,记作a-1

那就有:

a×x ≡ 1 (mod p)

(a×x)%p = 1

即(a×a-1)%p = 1

在虎哥的证明里,i和r都小于模数p,所以:

a×a-1 = 1

“证毕”

但是我看好多别的相乘并不是1,我一个蒟蒻也不明白为什么...

 

欧拉函数

欧拉函数就是从1到n中与n互质的数,有的资料说是1到n-1的,我觉得应该是n与n肯定互质吧(n ≠ 2)?

φ(n) = n × ((pi - 1)÷ pi),pi是n的质因数

这个通项公式完全不会证阿 先记住咕着

Update:

然而蒟蒻看了李煜东的蓝书后又会证了,来补一下

  设p,q为n的两个质因子

  那么根据p和q能筛出来的与n不互质的数就有 (n÷p)+(n÷q)个,那么暂时确定的与n互质的数就有n - (n÷p) - (n÷q)

  但是对于(p×q)这就相当于都删了两次(要实在理解不了就举n为12手模一下),所以要加回来一次

  所以目前根据p、q确定的1~n中与n互质的数有 n - (n÷p) - (n÷q) + (n÷(p×q))个

  然后再推广到n的所有质因子就是上面写的那个公式了

李煜东那本书上证明的挺好的,不过我学不来所以如果我写的实在看不懂就去看李煜东那本书上的吧,简单易懂。。

然后我又把虎哥的性质和证明粘过来力 不过我自己在草纸上证了,但实在懒得打...

求欧拉函数

这里虎哥给了两个情况,一个是求1~n的,一个是单求n的

两种情况
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int getphi(int n){//单独求n的 
	int SQ = int(sqrt(n+0.5)),ans = n;
	//如果有大于根号n的质因子那只能有一个,这种情况最后特判 
	//举例:99,sqrt(99)约等于10,但是他有一个大于10滴质因子11
	for(int i = 2 ; i <= SQ ; ++ i){
		if(n % i == 0){
			ans = (ans*(i-1)) / i;//欧拉函数通项公式
			while(n % i == 0)  n /= i;//分解质因数 
		}
	}
	if(n >= 2) ans = (ans*(n-1))/n;//n是那个 > sqrt(n)的质因子 
	return ans;
}
bool not_prime[N];
int phi[N],prime[N],tot;
void getqjphi(int n){
	phi[1] = 1;
	for(int i = 2 ; i <= n ; ++ i){
		if(not_prime[i] == false){
			prime[++ tot] = i;
			phi[i] = i-1;//性质2,i是质数,φ(p) = p-1 
		}
		for(int j = 1 ; j <= tot ; ++ j){
			if(i*prime[j] > n) break;
			not_prime[i*prime[j]] = true;
			if(i % prime[j] == 0){//变形1
				phi[i*prime[j]] = prime[j]*phi[i];
			}
			else{//变形2
				phi[i*prime[j]] = (prime[j]-1) * phi[i];
			}
		}
	}
}
void work(){
	
}
signed main(){
	work();
	return 0;
}

实际上只记第一个就可以,在考试的时候如果要求1到n的φ,那可以先从1~n循环求单个的φ值,然后输出打成表再在考试代码里整成数组,我们称之为【打表】(优 良 传 统) 

Update:不要打表,不要打表,不要打表!!!(比赛时打表因为代码太长CE了。。而且交上去的时候没有提示。。。)

概率与期望

感觉这边好难啊焯

觉得概率期望很难受还是因为基础概念太多而且一下涌出来,很难短时间内记住吧(对我这种蒟蒻来说qAq)

还是大部分概念去虎哥博客看 我在这里写的就算自学概率期望的笔记吧、、

虎哥!!!

注意

一定把∪ ∩ | 什么的基础概念记清。。。这个还是比较重要的说

互斥事件

比如{我和dbx一起吃饭} {我孤单地吃饭} 两个事件,我不可能又孤单又和dbx一起吃(当然不排除dbx嗯的情况(bushi)),这俩事件就是互斥事件

而且阿互斥事件可以有很多个,和对立事件不一样

对立事件

比如午休{卷}{睡大觉},假设只有这两种情况的话,那这俩就是对立事件(当然我午休肯定不会摸鱼的说())

对立事件只能有两个,要么发生事件A要么发生事件B,不可能A事件B事件都不发生

(当然无事发生也算一个事件的啦,但是无事发生可能属于事件B也可能属于事件A)

值得一提的是,对立事件属于互斥事件

独立事件

我们来康康虎哥的解释:{

如果事件 A 是否发生对事件 B 发生的概率没有影响,同时事件 B 是否发生对事件 A 发生的概率也没有影响,则称 A 与 B 是相互独立事件}

比如一堆事件的可能性:{中午和dbx一起吃}{今天午休卷数学}{今天下午大课间吃个橘子}{...}

啊?中午和谁一起吃和我中午卷哪一科有什么关系吗??没关系吧??

嗯 所以这俩是独立事件

条件概率

P(A|B) 指的是B发生的情况下A发生的概率

这个东西对本蒟蒻来说还是挺难理解的 这玩意最本质的变化实际上就是样本空间的缩小

为此蒟蒻去搜了搜 找到几篇挺容易理解的 LINK1 LINK2And example

一堆公式

这一堆公式都挺好理解的,,但是问题就在于很可能用的时候想不起来,所以敲一遍加深印象

  • 若A与B是互斥事件: P(A∪B) = P(A) + P(B)
  • 若A与B是对立事件: P(A∩B) = 0,P(A∪B) = P(A) + P(B)  = 1
  • 互斥事件的可加性: P(A1∪A2∪A3∪...∪An) =  P(A1) + P(A2) + ... + P(An)
  • 独立事件的可乘性: P(A∩B) = P(A) × P(B) 这个就是生物计算遗传概率那个
  • ⭐P(B|A) = P(A∩B) ÷ P(A)

然后就有了拓展公式们:

  • 乘法公式 P(A∩B) = P(B|A) × P(A) = P(A|B) × P(B)
  • ∀i,j,Ai∩Aj = ∅,并且,则P(B) =

Another Blog && Another another blog

(那两个条件说白了就是每两个事件都是互斥事件,并且这些事件的概率总和为1)

这个算是乘法公式的

因为我太逊了,所以别的先咕着

这篇关于数论补全计划【蒟蒻数论乱证】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!