暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

算法竞赛系列 | 威尔逊定理

1076

初等数论是数学的一个分支,它既古老又现代。最早的数论研究是从素数开始的,2000多年前欧几里得就发现了算术基本定理,即每个正整数可以按递增顺序唯一地写成素数的乘积。现代数论的发展始于高斯,他发明了同余,使研究整除关系时与研究方程一样方便。把素数从合数中分出来是数论的一个关键问题,发展了很多素性检验法;把正整数进行素因子分解是数论中的另一个核心问题;寻求方程的整数解是又一个重要内容。


01

威尔逊定理


威尔逊定理 若p为素数,则p可以整除(p-1)!+1。

威尔逊定理有多种表示方法,如下。

(1) ((p-1)!+1)mod p=0;

(2) (p-1)!mod p=p-1;

(3) (p-1)!=pq-1,q为正整数;

(4) 用同余表示为(p-1)! ≡-1(mod p)。

例如,5是素数,5可以整除(5-1)!+1=25。非素数不可以,如4不能整除(4-1)!+1=7。

下面用3道例题说明威尔逊定理的应用。


●  例6.26Zball in Tina Town(hdu 5391)

问题描述: 计算(n-1)! mod n。

输入: 第1行输入整数t,表示有t个测试;后面t行中,每行输入一个整数n。t≤105,2≤n≤109

输出: 对每个n,输出(n-1)! mod n。


(1) 当n为合数时,除了4以外,(n-1)!中肯定有两个数的积为n,得(n-1)! mod n=0。

(2) 当n为素数时,根据威尔逊定理,(n-1)! mod n=n-1。


● 例6.27YAPTCHA(hdu 2973)

问题描述: 计算,其中[x]表示不大于x的最大整数。

输入:第1行输入整数t,表示有t个测试;后面t行中,每行输入一个整数n。1≤n≤106

输出:对每个n,输出Sn


设p=3k+7,记

(1) 若p为合数,(p-1)!能被p整除,Sn=0。

(2) 若p为素数,(p-1)!=pq-1,有

所以转换为求1~n内的素数个数。因为n不大,用素数筛即可。


●  例6.28Fansblog(hdu 6608)

问题描述: 给定一个素数p,找到比p小的最大素数q,输出q! mod p。

输入: 第1行输入整数t,表示有t个测试;后面t行中,每行输入一个整数p。109≤n≤1014

输出: 对每个p,输出q! mod p。


先用Miller-Rabin素性测试找到q。根据威尔逊定理(p-1)! mod p=p-1,有q!(q+1)(q+2)…(p-1) mod p=p-1,即q! mod p=1/((q+1)(q+2)…(p-2)) mod p,需要用逆计算除法取模。

本题出现了对分数取模计算,分数取模是可计算的,根据费马小定理推出(b/a) mod m=(b am-2) mod m。例如,(2/5) mod 3=(2×53-2) mod 3=1。



《算法竞赛》系列推文正在连载中,欢迎持续关注!





扫码优惠购书


文章转载自清华计算机学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论