【数论数学】扩展欧拉定理

本文感谢@burnside神仙和@ddosvoid神仙的帮助审稿qwq

Definition

 a , m  Z+ , s.t. gcd(a,m)=1,则一定满足 aϕ(m)  1 (Mod m) 。该定理被称作欧拉定理。

Demonstration

xi为第i个与m互质的数,则共有ϕ(m)xi

pi = a × xi

引理一:

{pi}间两两模m不同余,{xi}间两两模m不同余。

证明:

先证{xi}间两两模m不同余:

因为  i  [1,ϕ(m)] , xi < m ,故

 xi Mod m  xi 

  i,j  [1,ϕ(m)],i  j 都有 xi  xj 。于是

 xi Mod m  xj Mod m 

{xi}间两两模m不同余

再证{pi}间两两模m不同余:

反证法,若存在一对 i,j  [1,ϕ(m)] , i  j , s.t. pi  pj (Mod m) ,则

a × xi  a × xj (Mod m)

\Rightarrow~x_i~\equiv~x_j~(Mod~m)$$。根据$\{x_i\}$间两两模$m$不同余,产生矛盾,于是$\{p_i\}$间两两模$m$不同余##### 证毕### 引理二:$\forall~i~\in~[1,\phi(m)]~,~p_i~$与$m$互质。##### 证明:写出$m,a,x_i,p_i$的唯一分解式:$$m~=~q_1^{c_1}~q_2^{c_2}~\dots~q_k^{c_k}

a=q1d1 q2d2  qkdk

xi = q1e1 q2e2  qkek

pi = q1e1+d1 q2e2+d2  qkek+dk

 i , s.t. ci  0 都有di = ei = 0,于是di+ei = 0

于是 i  [1,ϕ(m)] , pi m互质。

证毕

根据上述引理,可得所有pi的模m的解的集合与{xi}相等,于是他们的积模m的值也相等。

于是有

i=1ϕ(m) pi  aϕ(m) i=1ϕ(m) xi  i=1ϕ(m) xi (Mod m)

于是有aϕ(m)  1 (Mod m)。证毕。

Extension

对于am不一定互质的情况,有:

ac  {ac Mod ϕ(m)gcd(a,m) = 1acgcd(a,m)  1  c < ϕ(m)ac Mod ϕ(m) + ϕ(m)gcd(a,m)  1  c  ϕ(m)

Demonstration

m = 1时显然成立,以下讨论m  1的情况。

对于gcd(a,m) = 1 的情况,因为aϕ(m)  1,所以每ϕ(m)a就相当于乘1。于是只需要算c Mod ϕ(m)次。

对于c < ϕ(m)的情况,直接爆算

下面证明第三种情况。

先证明a是一个质数的情况:

引理1:

 p 为质数,r  Z+,都有ϕ(pr) = (p1) × pr1

证明:

由于p是一个质数,所以 1  (pr1) 中有且仅有i × p, i  (0,pr1) pr不互质。

于是ϕ(pr) = pr  pr1 = pr1 × (p  1) 

证毕。

引理2:

 k  Z a,b,x,y  Z+ , s.t. xa × yb = k,都有 a,b  ϕ(k) 

证明:

先考虑k为一个质数pr次幂的情况。根据引理1有:

ϕ(k) = ϕ(pr) = (p1) × pr1

下面说明(p1) × pr1  r

p=2时:

经验证 r=1,2,3 时成立。当 r>3 时按照r的大小做数学归纳,可证正确性。

 p > 2 时,不等号左侧增大,右侧不变,不等式仍然成立。

考虑k是多个质数幂时的情况,按照质数个数做数学归纳,正确性成立。

任意组合质数,引理得证。

证毕
引理3: r  c , s.t. aϕ(m)+r  ar (Mod m)
证明:

m = t × ar,其中gcd(t,a)=1t的存在性显然。

因为gcd(t,a) = 1,且ϕ函数是一个积性函数,所以ϕ(t) | ϕ(m)

根据欧拉定理,aϕ(t)  1 (Mod t),于是有

aϕ(m)  1 (Mod t)

同余式同乘ar,于是有

aϕ(m)+r  ar (Mod m)

已经证明可以构造出这样的r。根据引理2,r  ϕ(m)。又c  ϕ(m),于是可证构造出的r  c。定理得证。

证毕

于是

ac  acr+r  acr+ϕ(m)+r  ac+ϕ(m) (Mod m)

对上式做数学归纳,可得ac  ac+kϕ(m) , k  Z,需保证指数为正。

于是最小的合法的指数即为c Mod ϕ(m) + ϕ(m)

于是有$$ac~\equiv~a{cMod\phi(m)+\phi(m)}$$

a是一个质数的幂次时,设a=pk,则

ac  pck  pck+ϕ(m)  pck+kϕ(m)  (pk)c+ϕ(m)  (pk)c Mod ϕ(m) + ϕ(m)  (Mod m)

a时多个质数次幂的乘积时,依据唯一分解定理做数学归纳,即证正确性。证毕。

Example

传送门

Description

你有一个本子,你要往上面写全部的长度为nb进制数字,每一页可以写c个。要求所有数字必须严格不含前导0。求最后一页上有多少个数字

Input

三个数,依次是进制数b,数字长度n,每一页的个数c

Output

一行一个整数代表答案

Hint

Forall:

2  b < 10106 , 1  n < 10106 , 1  c  109

Solution

考虑计数原理,第一个位置可以填 1  (b1)  (b1) 个数字,剩下的位置可以填 0  ( b  1 )  b 个数字。于是答案即为 (b1) × b(n1)。后面的应用扩展欧拉定理即可解决。

Code

#include<cstdio>
#include<cstring>
#define rg register
#define ci const int
#define cl const long long

typedef long long int ll;

template <typename T>
inline void qr(T &x) {
	rg char ch=getchar(),lst=' ';
	while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
	while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	if(lst == '-') x=-x;
}

namespace IO {
	char buf[120];
}

template <typename T>
inline void qw(T x,const char aft,const bool pt) {
	if(x < 0) {x=-x,putchar('-');}
	rg int top=0;
	do {IO::buf[++top]=x%10+'0';} while(x/=10);
	while(top) putchar(IO::buf[top--]);
	if(pt) putchar(aft);
}

const int maxn = 1000010;

char B[maxn],N[maxn];
ll m,phi,b;

int ReadMod(char*,cl&);
int GetPhi(ll);
void MinuN();
int mpow(int,ll);
bool judge();

int main() {
	freopen("1.in","r",stdin);
	scanf("%s %s",B+1,N+1);qr(m);
	b=ReadMod(B,m);
	if(judge()) return 0;
	int k=GetPhi(m);
	MinuN();
	int n=ReadMod(N,k)+k;
	int ans=1ll*(b-1)*mpow(b,n)%m;
	ans=(ans+m)%m;
	qw(ans?ans:m,'\n',true);
	return 0;
}

int ReadMod(char *str,cl & p) {
	int l=strlen(str+1);
	ll _ret=0;
	for(rg int i=1;i<=l;++i) _ret=((_ret<<1)+(_ret<<3)+(str[i]^48))%p;
	return _ret;
}

int GetPhi(ll x) {
	ll _ret=x;
	for(ll i=2;i*i<=x;++i) if(!(x%i)) {
		_ret=_ret*(i-1)/i;
		while(!(x%i)) x/=i;
	}
	if(x != 1) _ret=_ret*(x-1)/x;
	return _ret;
}

void MinuN() {
	int l=strlen(N+1);
	--N[l];
	for(rg int i=l;i;--i) if(N[i] < '1') {
		N[i]+=10,--N[i-1];
	} else break;
	if(N[1] == '0'+10) N[1]='0';
}

int mpow(int x,ll k) {
	int _ret=1,_temp=x;
	while(k) {
		if(k&1) _ret=1ll*_ret*_temp%m;
		_temp=1ll*_temp*_temp%m;
		k>>=1;
	}
	return _ret%m;
}

bool judge() {
	int l=strlen(N+1);
	if(l >= 17) return false;
	ll _tp=0;
	for(rg int i=1;i<=l;++i) _tp=(_tp<<1)+(_tp<<3)+(N[i]^48);
	int ans=1ll*(b-1)*mpow(b,_tp-1)%m;
	ans=(ans+m)%m;
	qw(ans?ans:m,'\n',true);
	return true;
}

Summary

扩展欧拉定理可以用在底数与模数不互质的情况下,将质数将至与模数同阶的大小,从而可以使用快速幂进行运算。

注:本篇内容部分证明参考该BAJim_H的博客,在此表示衷心的感谢。

posted @   一扶苏一  阅读(7333)  评论(8编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示