数论及其应用——同余式定理

这篇文章我们将介绍数论当中几个很重要的定理:威尔逊定理、费马小定理以及欧拉定理,并讨论一些基于这些定理的算法。

首先我们给出费马小定理:如果p是素数,并且gcd(a,p) = 1 , 那么有a^(p-1) = 1(mod p)。

而关于这个定理的证明,也是不难理解的。

在证明之前,我们先需要知道这样两个引理。

引理1:若a、b、c为任意3个整数,且gcd(m,c) = 1,则当ac = bc(mod m)时,有a = b (mod m)。

引理2:设m是一个整数,且m>1,b是一个整数且gcd(m,b)=1.如果a1,a2,a3,a4,…am是模m的一个完全剩余系,那么ba[1],ba[2],ba[3],ba[4],…ba[m]也构成模m的一个完全剩余系。

这里需要解释一下的是,所谓完全剩余系,即{a1,a2,a3,a4,…am}中任意一个元素ai % m != 0。针对引理1,通过同余式本身的特点,都十分易证,随后再基于引理1,引理2也不难得证。这里便不再累述。   有了这两个引理做铺垫,下面便可以开始费马小引理的证明了。

构造素数p的完全剩余系P = {1,2,3,……p-1}。

因为gcd(a,p) = 1,由引理2得素数p的新的完全剩余系:A = {a,2a,3a,……(p-1)a}。

我们选出A、P中第i个元素,由引理1得,Ai = Pi(mod p),因此我们容易得到如下等式。

1 * 2 * 3 *……(p-1) = a * 2a * 3a * ……(p-1)a (mod p)

等式两边同除(p - 1)!,得到a^(p-1) = 1 (mod p),定理得证。

既然知道了费马小定理的内容和证明了,这里我们就用它进行一下拓展利用。

首先我们知道,在费马小定理的等式a^(p - 1) = 1 (mod p)中,如果p是素数,那么等式是成立的。

即  isprime(p) = 1  => a^(p - 1) = 1 (mod p) 。   那么我们根据逆否命题与原命题的等价性,可以得到,a^(p - 1) != 1 (mod p) => isprime(p) = 0。

那么逆命题和否命题与原命题是否等价呢?如果等价,我们岂不是可以通过判断是否满足费马小定理的等式来判断p是否为素数了?

实践表明,满足费马小定理的a、p组合中,p是可以为合数的,不妨自己举几个例子。   因此对于满足费马小定理等式的a、p,有这样的定义。如果p是合数,则称p是以a为基的伪素数。

我们不妨通过一个题目来理解一下所谓伪素数的概念。(Problem source:pku 3641)

Description

Fermat‘s theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)

Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.

Input

Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.

Output

For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".

题目大意:基于伪素数的概念,给出a、p,请你判断p是否是以a为基的伪素数。

数理分析:有了上文对伪素数概念的较少,我们知道,伪素数首先必须是合数,然后需要满足费马小定理。

编程实现:在判断是否是伪素数的时候,由于是判断单个数字,所以使用朴素的判断法即可。而判断是否满足费马小定理的时候,则用到了我们在之前讨论过的乘法快速幂算法。   参考代码如下。

#include<iostream>
#include<math.h>
using namespace std;
bool ifprime(long long n)
{
     long long i;
     int iffind = 0;
     if(n == 2 || n == 1)  return 1;
     else
     {
           for(i = 2;i <= sqrt(n + 0.0);i++)
                if(n%i == 0)
           {
                 iffind = 1;
                 break;
           }
           if(iffind)
              return 0;
           else
              return 1;
     }
}

long long quick_mod(long long a , long long b , long long m) //快速幂取模,计算a^b(mod m)的值
{
     long long ans = 1;
     while(b)
     {
          if(b&1)
          {
               ans = (ans * a)%m;
               b--;
          }
          b /= 2;
          a = a * a %m;
     }
     return ans;
}

int main()
{
      long long n , a, p ,b;
      while(cin >> p >> a)
      {
            if(p == 0 && a == 0)  break;
            if(ifprime(p))
                  cout<<"no"<<endl;
            else
            {
                 long long ans = quick_mod(a,p,p);
                 if(ans == a)   cout<<"yes"<<endl;
                 else           cout<<"no"<<endl;
            }
      }
      return 0;
}
时间: 2024-10-12 16:15:07

数论及其应用——同余式定理的相关文章

数论之中国剩余定理

中国剩余定理是中国古代求解一次同余式组(见同余)的方法,是数论中一个重要定理,又称孙子定理. 孙子定理 孙子定理主要用来求解模线性不定方程组. 对于方程组:  x0≡a0(mod b0) x1≡a1(mod b1) x2≡a2(mod b2) .  .  . xn≡an(mod bn) 设m=b0*b1*b2*...*bn,mi=m/bi 得到方程组 mixi+biyi=1 扩欧求解后,原模线性方程组的解为: ∑mi*ai*xi  mod m 看代码吧: 1 #include <cstdio>

HDU - 1098 - Ignatius&#39;s puzzle (数论 - 费马小定理)

Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7012    Accepted Submission(s): 4847 Problem Description Ignatius is poor at math,he falls across a puzzle problem,so he has no

GCD SUM 强大的数论,容斥定理

GCD SUM Time Limit: 8000/4000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus Problem Description 给出N,M执行如下程序:long long  ans = 0,ansx = 0,ansy = 0;for(int i = 1; i <= N; i ++)   for(int j = 1; j <= M; j ++)       if(gcd(i,j)

数论总结 (常用定理+ 模板)

刷了好几天的数论了 noip要考的几乎都刷了一遍 看着公式有生无可恋的感觉啊 下面是一些总结 1.组合数 去年的noip考了组合数递推公式 C(n, m) = C(n - 1, m - 1) + C(n - 1, m); 还有可以通过二项式定理推出来的几个结论 C(n, 0) + C(n, 1) + C(n, 2) + ... + C(n, n) = 2n ΣC(n, i) = 2n - 1  (i 为基数或 i 为偶数) 2.(扩展)欧几里德算法 欧几里德算法 1 void gcd(ll a,

【数学】【数论】中国剩余定理

写在前面 记录了个人的学习过程,同时方便复习 中国剩余定理 [物不知数]是中国古代著名算题 原载<孙子算经>卷下第二十六题: "今有物不知其数,三三数之剩二:五五数之剩三:七七数之剩二.问物几何?" 当时虽已有了答案23,但它的系统解法是秦九韶在<数书九章·大衍求一术>中给出的 中国剩余定理是中国古算中最有独创性的成就之一,属现代数论中的一次同余式组问题 --bia度百科 有x个物件,三个三个数剩2个,五个五个位数剩3个,七个七个数剩2个 那么就是求解以下同余方

BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】

2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1326  Solved: 815[Submit][Status][Discuss] Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1<=N<=1000) ,经过协商,火星人只要其中的K 个 . jyy 将 K个瓶子交给

【数论】中国剩余定理

问题:给定a1a2...an, 和m1,m2...mn,mi之间两两互质,求一个x,使得x/ai=mi 构造方法: 先求出M=∏ni=1mi, 对于每个mi,求出M / mi, 然后和mi利用拓展欧几里得算法求出M/mi?p+mi?q=1时的值,取∑ni=1(p?ai?M/mi)就是答案. 证明: 证明参考了wiki 由于mi之间两两互质,所以gcd(mi,mj)=1,gcd(mi,Mi)=1, 求出数论倒数ti使得Mi?ti%mi=1,这就是上面利用扩展欧几里得算法求出的p值,ai?p?M%m

POJ 1426 Find The Multiple(数论——中国同余定理)

题目链接: http://poj.org/problem?id=1426 Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there

[数论]拓展中国剩余定理

拓展中国剩余定理 •拓展中国剩余定理 拓展中国剩余定理是用来解同余方程 $\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2}\left( mod\ m_{2}\right) \\ \ldots \\ x\equiv c_n\left( mod\ m_n\right) \end{cases}$ ps.如果m1,m2,m3...mn两两互素的话,可以用中国剩余定理来求 假设 $x\equiv c_{1} (mod \