1. 程式人生 > >一些數論總結(Last update 10/19)

一些數論總結(Last update 10/19)

數論

By Misia in 2018

自制課件


費馬小定理

若p是質數,a是任意整數,並且a不能被p整除,於是:
a p 1 1

( m o d   p ) a^{p-1}≡1(mod \ p)


尤拉函式

OEIS A000010

φ(n)表示1~n以內和n互質的數的個數。
p表示n的所有質因數。
φ ( n ) = n

p n p   ( 1 1 q ) φ(n)=n*\prod_{p|n}^p\ (1-\frac{1}{q})

  • 尤拉函式是積性函式,若m,n互質,則: φ ( m n ) = φ ( n ) φ ( m ) φ(mn)=φ(n)*φ(m)
  • 若n為奇數,則: φ ( 2 n ) = φ ( n ) φ(2n)=φ(n)
  • 若n為質數,則: φ ( n ) = n 1 φ(n)=n-1

線性篩尤拉函式

int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因數,p是素數,pt是素數個數
int get_phi(){
    phi[1]=1;
    int N=maxn,k;
    for(int i=2;i<N;i++){
        if(!m[i]){//i是素數
            p[pt++]=m[i]=i,phi[i]=i-1;
        }
        for(int j=0;j<pt&&(k=p[j]*i)<N;j++){
            m[k]=p[j];
            if(m[i]==p[j]){//為了保證以後的數不被再篩,要break
                phi[k]=phi[i]*p[j];
/*這裡的phi[k]與phi[i]後面的∏(p[i]-1)/p[i]都一樣(m[i]==p[j])只差一個p[j],就可以保證∏(p[i]-1)/p[i]前面也一樣了*/
                break;
            }
            else{
                phi[k]=phi[i]*(p[j]-1);//積性函式性質
            }
        }
    }
}

尤拉定理

g c d ( a , b ) = 1 gcd(a,b)=1 ,則: a φ ( b ) 1 ( m o d   b ) a^{φ(b)}≡1(mod \ b)

更常用的: a b % m = a b % φ ( m ) + φ ( m ) % m a^b \% m=a^{b \% φ(m)+φ(m)}\%m


原根

定義:設m>1, g c d ( a , m ) = 1 gcd(a,m)=1 ,使得 a r 1 ( m o d   m ) a^r≡1(mod \ m) 成立的最小的r,稱為a對模m的階,記為 δ m ( a ) \delta_m(a)

數m有原根的充要條件: m = 2 , 4 , p k , 2 p k m=2,4,p^k,2p^k (p為奇素數,k為任意正整數)。

定理

  • 如果模m有原根,那麼它一共有 φ ( φ ( m ) ) φ(φ(m)) 個原根。
  • 若m>1, g c d ( a , m ) = 1 gcd(a,m)=1 a n 1 ( m o d   m ) a^n≡1(mod \ m) ,則 δ m ( a ) n \delta_m(a)|n
  • 如果p為素數,那麼素數p一定存在原根,並且p模的原根的個數為 φ ( p 1 ) φ(p-1)
  • 設m是正整數,a是整數,若a模m的階等於 φ ( m ) φ(m) ,則稱a為模m的一個原根。

找原根

若欲求m的原根的話,對 φ ( m ) φ(m) 進行質因數分解,求出所有質因子 p i p_i ,若對於任意 p i p_i ,均滿足 g φ ( m ) p i 1 ( m o d   m ) g^{\frac{φ(m)}{p_i}}\neq 1(mod \ m) ,則g是m的原根。

求原根的程式碼

#include<bits/stdc++.h>
using namespace std;
int p[100007], c;
long long pow_mod(long long a,long long x,long long m){
	long long ans=1;
	while(x){
		if(x&1){
			ans=ans*a%m;
		}
		a=a*a%m;
		x>>=1;
	}
	return ans;
}
bool ok(int x,int ph,int m){
	for(int i=0;i<c;i++){
		if(pow_mod(x,ph/p[i],m)==1){
			return 0;
		}
	}
	return 1;
}
void divide(int x){
	c=0;
	for(int i=2;i*i<=x;i++){
		if(x%i==0){
			p[c++]=i;
			while(x%i==0){
				x/=i;
			}
		}
	}
	if(x>1){
		p[c++]=x;
	}
}
int main(){
	int wxh;
	scanf("%d",&wxh);
	while(wxh--){
		int n;
		scanf("%d",&n);
		int m=n,ans=m;
		for(int i=2;i*i<=n;i++){
			if(n%i==0){
				ans=ans/i*(i-1);
				while(n%i==0){
					n/=i;
				}
			}
		}
		if(n>1){
			ans=ans/n*(n-1);
		}
		divide(ans);
		int x=ans;
		while(!ok(x,ans,m)){
			x--;
		}
		printf("%d\n",x);
	}
	return 0;
}

二次剩餘

當存在某個x,式子 x 2 d ( m o d   p ) x^{2}≡d(mod\ p) 成立時,稱“d是模p的二次剩餘”。
當對任意x不成立時,稱“d是模p的二次非剩餘”。
學不來
關於如何計算二次剩餘,詳見Miskcoo的部落格


解方程a^b≡n(mod p)(p是素數)

一、已知n,p(p是奇數),b=2,求a

由費馬小定理: n ( p 1 ) / 2 ± 1 ( m o d   p ) n^{(p-1)/2}≡\pm1(mod\ p)
根據尤拉準則,二次剩餘有解當且僅當 n ( p 1 ) / 2 1 ( m o d   p ) n^{(p-1)/2}≡1(mod\ p)
如果c滿足 w = c 2 n w=c^2-n 不是p的二次剩餘,那麼 a = ( c + ( w ) ) ( p 1 ) / 2 a=(c+\sqrt(w))^{(p-1)/2} 是方程 a 2 n ( m o d   p ) a^2≡n(mod\ p) 的解。因為有一半的數是非二次剩餘,所以可以隨機c,驗證即可。
詳見Philipsweng的部落格

二、已知n,p,a,求b

使用Baby-step giant-step演算法
(臨時)詳見Yuiffy的部落格

模板(Poj 2417)

#include<bits/stdc++.h> 
using namespace std;
long long p,b,n;
void exgcd(long long c,long long d,long long &x,long long &y){
	if(!d){
    	x=1;y=0;
    	return ;
	}
	exgcd(d,c%d,x,y);
	long long z=y,r=x-(c/d)*y;
	x=z;y=r;
}
void work(){
	long long m=(long long)sqrt(p),bb=1,nn=n,inv,t;
	map<int,int> num;
	map<int,bool> app;
	app[1]=1;
	num[1]=0;
	for(int i=1;i<=m-1;i++){
	    bb=bb*b%p;
	    if(!app[bb]){
	        app[bb]=1;
	        num[bb]=i;
	    }
	}
	bb=bb*b%p;
	exgcd(bb,p,inv,t);
	if(inv>0){
		inv%=p;
	}
	else{
		inv=inv%p+p;
	}
	for(int i=0;i<=m;i++){
	    if(app[nn]){
	        printf("%lld\n",i*m+num[nn]);
	        return;
	    }
	    nn=nn*inv%p;
	}
	printf("no solution\n");
}
int main(){
	while(~scanf("%lld%lld%lld",&p,&b,&n)){
		work();
	}
	return 0;
}

Ramsey定理

存在一個p,使得對p個點的完全圖紅藍染色,要麼存在n個點的紅色完全子圖,要麼存在m個點的藍色完全子圖。
把最小的p記作R(n,m),稱為Ramsey數,一般用到R(3,3)=6。
更大的Ramsey數特別難算。


第一類Stirling數

OEIS A008275(有符號)

表示將n個不同元素構成m個圓排列的方案數。
通俗來說,就是n個不同人圍m個相同圓桌而坐,要求各桌非空,其不同方案數。
第一類Stirling數又分為無符號( S u S_u )與有符號( S s S_s )兩種。

無符號

遞推式
S u ( n + 1 , m ) = S u ( n , m 1 ) + n S u ( n , m ) S_u(n+1,m)=S_u(n,m-1)+nS_u(n,m)

相關推薦

一些數論總結(Last update 10/19)

數論 By Misia in 2018 自制課件 費馬小定理 若p是質數,a是任意整數,並且a不能被p整除,於是: a

【周總結】2018-10-19—2018-11-25

【計算機】 ①長達四個月的學生專案結束了,其實從8月8號開始敲,9月1開學前就已經快敲完了,當時小夥伴還跟我說,開學後就有很多事了。會特別忙,當時的我很天真,不屑一顧的回她能有多少事呢!學習的時間總會有的!但真正的開學後,由於還涉及到了跨越城市的搬校區,還需要一段適應新

2018.10.19學習總結

取消 baidu 手機 驗證 cxx split ext1 spl 非貪婪 1正則表達式import re# [] 範圍匹配 中間 用-來連接# re.findall("[a-zA-Z0-9]","a ab abc abcd a123c")# 如果要匹配 符號- 要寫表

2017-10-19 遠光軟體Java開發面試+達達京東到家筆試總結

遠光軟體Java開發面試: Java建立物件過程JavaScript建立物件的方法      直接建立、用函式來建立jQuery有哪些選擇題    元素選擇器     層疊選擇器    過濾選擇器

2017.10.19開學第八週週中訓練總結

線段樹,樹狀陣列結束了,線段樹沒有完成任務,杭電也打不開了。。。幸好記過題目,搜了題解看了兩個題,一個是樹狀陣列1008,那個根節點存的是矩陣的,當時不太理解,再看看,有那麼一點感覺,就是把下面的矩陣訂好了,對第一維的點更新值,求和,可以理解為,每一個矩陣對應一顆樹?? 還

Unity 的一些優化總結 (難度3 推薦4)

rdo serial 分配內存 down 物理系統 頂點 最大 nbsp ade 原文地址: http://www.jianshu.com/p/3acee1101fe4 從別的地方看到一些資源使用方面的文章,從中抽取一些細節在這裏總結一下: Draw Call數量、Tria

關於Java的一些知識點總結

知識點總結 自己 pool 順序 堆棧 子類 model 架構 深入   本篇文章會對面試中常遇到的Java技術點進行全面深入的總結,幫助我們在面試中更加得心應手,不參加面試的同學也能夠借此機會梳理一下自己的知識體系,進行查漏補缺(閱讀本文需要有一定的Java基礎)。本

10.19編寫一個函數 alloc(n) 用來在內存區開辟一個連續的空間(n個字節) 。 和 free(char * p),將地址p開始的各單元釋放。

null 地址 可用 第一個 ret 定義 define 編寫 bsp #include <stdio.h> #define NULL 0 #define ALLOCSIZE 1000 //最大存儲數量 char allocbuf[ALLOCSIZ

數論總結 (常用定理+ 模板)

擴展歐幾裏德算法 二項式 rime spa 模板 phi 歐拉函數 noip prim 刷了好幾天的數論了 noip要考的幾乎都刷了一遍 看著公式有生無可戀的感覺啊 下面是一些總結 1.組合數 去年的noip考了組合數遞推公式 C(n, m) = C(n - 1, m -

[轉]用python爬蟲抓站的一些技巧總結 zz

內容 req xxxxx pic 個數 相關 choice 都是 observe 來源網站:http://www.pythonclub.org/python-network-application/observer-spider 學用python也有3個多月了,用得最

對於方法的一些學習總結

邏輯 以及 參數 復用性 進行 關系 方法調用 函數 void 1、方法的定義   方法就是定義在類中具有特定功能的一段獨立的小程序,也稱為函數。   方法就是行為,一個類可以有很多方法。邏輯運算、數據修改以及所有動作都是在方法中完成的。 2、方法的特點   定義方法

10.19-10.22 iptables規則備份和恢10.20 firewalld的9個zone

iptables 規則 備份 10.19 iptables規則備份和恢復 10.20 firewalld的9個zone 10.21 firewalld關於zone的操作 10.22 firewalld關於service的操作 # 10.19 iptables 規則備份和恢復 - 保存和

XSS插入繞過一些方式總結

image 移除 dep hash 時間差 timeout tree 弱點 chrome 詳見:http://blog.csdn.net/keepxp/article/details/52054388 1 常規插入及其繞過 1.1 Script 標簽 繞過進行一次移除操

10.19

嬰兒 .net 忘記 文檔 wid 外部 https radi contain 1、制作自己的導航條 <nav style="background-color: blanchedalmond"> <img src="https://haitao.

一些數論知識點

階乘 class mage 剩余定理 中國 con 知識 turn pmod Lucas定理: $C_{b}^{a}\pmod p= C_{b/p}^{a/p}*C_{b \pmod p}^{a \pmod p}\pmod p$ 通常在p較小時用。 對於$C_{b/p

關於servlet的一些學習總結

應用 placed ddc .class con att 也會 等於 最終 一,什麽是Servlet? Servlet是一個Java編寫的程序,此程序是基於Http協議的,在服務器端運行的(如tomcat),是按照Servlet規範編寫的一個Java類。 二,Ser

「mysql優化專題」單表查詢優化的一些總結,非索引設計(3)

flush src innodb atp show 優化 ase 驗證 where子句 單表查詢優化:(關於索引,後面再開單章講解) (0)可以先使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫我們分析是查詢語句或是表結構的性能瓶頸。

3.MySQL優化---單表查詢優化的一些總結(非索引設計)

sql優化 所有 結果集 單表 搜索 結果 查詢語句 cnblogs sel 整理自互聯網.摘要: 接下來這篇是查詢優化。其實,大家都知道,查詢部分是遠遠大於增刪改的,所以查詢優化會花更多篇幅去講解。本篇會先講單表查詢優化(非索引設計)。然後講多表查詢優化。索引優化設計以及

數論總結1(基礎數論

周期 display clas ems inline 左右 最大值 沒有 時間 一.進位計數制 1.進制表示: 表示b進制下的n+1位數。 2.進制轉換: 進制向十進制轉換: 乘以基數並展開: 十進制向b進制轉換: 整數部分除以基數並倒取余數。 小數部分乘以基數,並順取