前言
在你谷上面找到一個分圓多項式的板子題,然后扒下來把分圓多項式又復習了一遍。
鳴謝:
本原單位根
要講分圓多項式肯定要先講本原單位根。
與本原畢達哥拉斯三元組一樣,本原單位根顯然有 \(\gcd(i,j)=1\) 這樣類型的限制。那么映射到單位根這里,是指 \(\omega_n^k\) 中有 \(\gcd(n,k)=1\)。
那么我們得到 \(n\) 次的本原單位根有 \(\varphi(n)\) 個。
分圓多項式
定義一個 \(n\) 次的分圓多項式 \(\Phi_n(x)\)。我們有他的 \(\varphi(n)\) 個本原單位根,假設為 \(\epsilon_1,\epsilon_2,\epsilon_3,...,\epsilon_{\varphi(n)}\)。那么此時 \(\Phi_n(x)=\prod_{i=1}^n(x-\epsilon_d)\)。
根據這個定義可以寫出:
性質
性質 1
要證兩個首一多項式相等,可以證明 \(\prod_{d|n}\Phi_d(x)|x^n-1\),且 \(x^n-1|\prod_{d|n}\Phi_d(x)\)。此處證明略,留作思考。
例:P1250 - 因式分解。
分解 \(x^n-1\),運用分圓多項式的這個性質,就可以將其轉化為求解 \(\Phi_d(x)\) 的問題。
性質 2
pf: 因為 \(\prod_{d|n}\Phi_d(x)=x^n-1\),對兩邊同時去對數,得:
展開,並進行莫比烏斯反演得:
兩邊同時 \(\exp\),
Q.E.D。
繼續回到上面看 P1520 因式分解。按照這個式子模擬一下即可。
參考了一下魚的。
#include<bits/stdc++.h>
#define HohleFeuerwerke using namespace std
#pragma GCC optimize(3,"Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#define int long long
HohleFeuerwerke;
inline int read(){
int s=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) s=s*10+c-'0';
return s*f;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
putchar('0'+x%10);
}
const int MAXN=6e3+5,MAXNlog2=1e2+5;
int mu[MAXN],pri[MAXN],tot;
bool ispri[MAXN];
inline void init(){
mu[1]=ispri[1]=true;
for(int i=2;i<=MAXN-5;i++){
if(!ispri[i]) pri[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*pri[j]<=MAXN-5;j++){
ispri[i*pri[j]]=true;
if(i%pri[j]) mu[i*pri[j]]=-mu[i];
else{mu[i*pri[j]]=0;break;}
}
}
}
struct poly{
int len,a[MAXN];
poly(){memset(a,0,sizeof(a));len=0;}
inline int operator [](const int &x)const{return a[x];}
inline int& operator [](const int &x){return a[x];}
}phi[MAXNlog2];
inline void print(poly x){
for(int i=x.len;i>=0;i--){
if(i==1&&i==x.len){
if(x[i]>0&&x[i]!=1) printf("%lldx",x[i]);
if(x[i]==1) printf("x");
if(x[i]<0&&x[i]!=-1) printf("%lldx",x[i]);
if(x[i]==-1) printf("-x");
}
else if(i==x.len){
if(x[i]==1) printf("x^%lld",i);
else printf("%lldx^lld",x[i],i);
}
else if(i==1){
if(x[i]>0&&x[i]!=1) printf("+%lldx",x[i]);
if(x[i]==1) printf("+x");
if(x[i]<0&&x[i]!=-1) printf("%lldx",x[i]);
if(x[i]==-1) printf("-x");
}
else if(i==0){
if(x[i]>0) printf("+%lld",x[i]);
else printf("%lld",x[i]);
}
else{
if(abs(x[i])!=1){
if(x[i]<0) printf("-%lldx^%lld",abs(x[i]),i);
if(x[i]==0) continue;
if(x[i]>0) printf("+%lldx^%lld",x[i],i);
}
if(abs(x[i])==1){
if(x[i]==-1) printf("-x^%lld",i);
if(x[i]==1) printf("+x^%lld",i);
}
}
}
}
inline void multi(poly &f,int d){
f.len+=d;
for(int i=f.len;i>=d;i--) f[i]=f[i-d]-f[i];
for(int i=0;i!=d;i++) f[i]=-f[i];
}
inline bool cmp(poly a,poly b){
if(a.len!=b.len) return a.len<b.len;
for(int i=a.len;i>=0;i--){
if(abs(a[i])!=abs(b[i])) return abs(a[i])<abs(b[i]);
if(a[i]!=b[i]) return a[i]<b[i];
}
return true;
}
inline poly getphi(int n){
poly mul,div,ret;
mul[0]=div[0]=1;
for(int d=1;d*d<=n;++d){
if(n%d!=0) continue;
if(mu[n/d]==1) multi(mul,d);
else if(mu[n/d]==-1) multi(div,d);
if(d*d==n) continue;
if(mu[d]==1) multi(mul,n/d);
else if(mu[d]==-1) multi(div,n/d);
}
if(div.len==0) return mul;
ret.len=mul.len-div.len;
ret[0]=mul[0]*div[0];
for(int i=1;i<=ret.len;i++){
ret[i]=mul[i];
for(int j=0;j!=i;j++) ret[i]-=ret[j]*div[i-j];
ret[i]*=div[0];
}
return ret;
}
int n,polycnt;
signed main()
{
// freopen("P1520_2.in","r",stdin);
// freopen("P1520_2-mine.out","w",stdout);
n=read();
init();
for(int i=1;i<=sqrt(n);++i){
if(n%i!=0) continue;
phi[++polycnt]=getphi(i);
if(i!=sqrt(n)) phi[++polycnt]=getphi(n/i);
}
if(polycnt==1){
print(phi[1]);
return 0;
}
sort(phi+1,phi+1+polycnt,cmp);
for(int i=1;i<=polycnt;++i){
printf("("),print(phi[i]),printf(")");
}
puts("");
return 0;
}
性質三
分圓多項式在 \(\mathbb{Q}\) 內不可約。可以運用愛森斯坦判別法證明。
拓展:愛森斯坦判別法是指:對一個整系數多項式 \(f(x)=\sum_{i=0}^na_ix^i\),如果存在素數 \(p\),使得:
- \(p\not|a_n\),\(p|a_0,a_1,a_2,a_3,...,a_{n-1}\)。
- \(p^2|a_0\)。
那么 \(f(x)\) 在 \(\mathbb{Q}\) 上不可約。
性質四
已知 \(n\) 是大於 \(1\) 的正整數,且 \(n\not=6\),則當 \(x\leq2\) 時,恆有 \(\Phi_n(x)>n\)。
性質五
設 \(a,n\) 都是正整數,\(a>1,n>2\),\(p\) 是素數,\(p|\gcd(n,\Phi_n(a))\),則 \(p\) 是 \(n\) 的最大素因子,且 \(p^2\not|\Phi_n(a)\)。
與數論的聯系
莫比烏斯函數
可以看出,在導出分圓多項式的時候運用了莫比烏斯反演。那么顯然,單位根有與莫比烏斯函數相關的推論。
Zisgmondy's Theorem(席格蒙德定理)
若有 \(a,b\in\mathbb{N}^{+}\),\(\gcd(a,b)=1\),\(a>b\),\(n\in\mathbb{N}^{+},n>1\)。則:
- i. 存在 \(a^n-b^n\) 的一個素因子 \(p\),使得對任意小於 \(n\) 的正整數 \(k\),都有 \(p\) 不整除 \(a^k-b^k\)。以下兩情形除外:
- \(n=2\) 時,\(a+b\) 是 \(2\) 的冪。
- \(n=6\) 時,\(a=2,b=1\)。
- ii. 存在 \(a^n+b^n\) 的一個素因子 \(q\),使得對任意小於 \(n\) 的正整數 \(k\),都有 \(q\) 不整除 \(a^k+b^k\),\(a=2,b=1,n=3\) 時除外。
Zisgmondy's Theorem 當 \(b=1\) 時,Part 1 就會變成:\(a>1,a\in\mathbb{N}^{+}\),\(n>2,n\not=6,n\in\mathbb{N}^{+}\),那么存在素數 \(p\),滿足:
- i. \(p|a^n-1\)。
- ii. 對於任意 \(m\in\mathbb{N}^{+},m<n\),都有 \(p|a^m-1\)。
這個是可以用分圓多項式來導出的。
結語
分圓多項式和很多高代和數論內容相關,可以說是一座連接數論和代數的重要橋梁。本文中介紹的性質不過冰山一角,留待更多美妙優雅之處等待讀者自行探尋。