zoukankan      html  css  js  c++  java
  • 关于欧拉定理的证明以及扩展欧拉定理的证明及其应用

    • 前置芝士:

      欧拉函数(φ(p)):即指在[1,p-1][1,p1]中与p互质的数的个数,特别的,φ(1)=1。

    • 单数值求欧拉函数:(时间复杂度O(√n))
    •  1 int euler(int n){ //返回euler(n)   
       2    int res=n,a=n;  
       3    for(int i=2;i*i<=a;i++)  
       4        if(a%i==0){  
       5             res=res/i*(i-1);  
       6             while(a%i==0) a/=i;  
       7         }  
       8     }  
       9     if(a>1) res=res/a*(a-1);  
      10     return res;  
      11 }
      View Code
    • 线性筛欧拉函数:(时间复杂度O(n))
    •  1 void getphi(){  
       2     phi[1]=1;  
       3     for(i=2;i<=N;i++){//相当于分解质因式的逆过程 
       4         if(!mark[i]){  
       5             prime[++tot]=i;//筛素数的时候首先会判断i是否是素数。  
       6             phi[i]=i-1;//当 i 是素数时 phi[i]=i-1  
       7         }  
       8         for(j=1;j<=tot;j++){  
       9             if(i*prime[j]>N)  break;  
      10             mark[i*prime[j]]=1;//确定i*prime[j]不是素数  
      11               if(i%prime[j]==0){//接着我们会看prime[j]是否是i的约数   
      12                  phi[i*prime[j]]=phi[i]*prime[j];
      13                  break;
      14             }
      15               else  phi[i*prime[j]]=phi[i]*(prime[j]-1);//其实这里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性  
      16        }  
      17    }  
      18 }
      View Code
    • Eg:通式:

      欧拉定理

    • 引入概念

      基本概念——完全剩余系:从模n的每个剩余类中各取一个数,得到一个由0到n-1,n个数组成的集合,叫做模n的一个完全剩余系。

      就是说刚好取遍所有mod p意义下余数的任意一个数的集合。

     

      

    引入引理

     

     


     


    下面是对于欧拉定理的证明

     

    左右同时约分可得:

     

     


      扩展欧拉定理及其证明

     

     证明: 附链接[(https://blog.csdn.net/can919/article/details/82318115)]

     

     对于质数的幂在mod(m)的意义下:

     

     

     所以

     

     综述:

    得证。


     

    • 下面是 扩展欧拉定理(P5091)模板代码(读入时根据扩展欧拉定理优化取模)

    •  1 #pragma GCC optimize(2)
       2 #include<cstring>
       3 #include<cstdio>
       4 #include<cmath>
       5 #include<iostream>
       6 #include<cctype>
       7 #include<ctime>
       8 #include<cstdlib>
       9 #include<map>
      10 #include<algorithm>
      11 
      12 using namespace std;
      13 
      14 #define ll long long 
      15 
      16 ll a,m,b;
      17 
      18 ll power(ll a,ll b,ll m);
      19 inline ll read();
      20 inline ll read_(ll m);
      21 inline void write(ll x);
      22 ll euler(ll n);
      23 
      24 int main(){
      25     a=read();m=read();
      26     b=read_(euler(m));
      27     write(power(a,b,m));
      28 }
      29 
      30 ll power(ll a,ll b,ll m){
      31     ll ret=1;
      32     while(b){
      33         if(b&1) ret=ret*a%m;
      34         a=a*a%m;
      35         b>>=1;
      36     }
      37     return ret;
      38 }
      39 
      40 inline ll read(){
      41     ll a=1,b=0;char t;
      42     while(t<'0'||t>'9'){
      43         if(t=='-') a=-1;
      44         t=getchar();
      45     }
      46     while(t>='0'&&t<='9') b=b*10-'0'+t,t=getchar();
      47     return a*b;
      48 }
      49 
      50 inline ll read_(ll m){
      51     bool flag=0;
      52     ll y=0;char t=getchar();
      53     while(t<'0'||t>'9') t=getchar();
      54     while(t>='0'&&t<='9'){
      55         y=y*10-'0'+t;
      56         if(y>=m) flag=1;
      57         y%=m;
      58         t=getchar();
      59     }
      60     if(flag) return y+m;
      61     return y;
      62 }
      63 
      64 inline void write(ll x){
      65     ll fig[33],top=0;
      66     if(!x) putchar('0');
      67     while(x) fig[++top]=x%10,x/=10;
      68     while(top) putchar(fig[top--]+'0');
      69 }
      70 
      71 ll euler(ll n){
      72     ll res=n,a=n;
      73     for(int i=2;i*i<=a;i++)
      74         if(!(a%i)){
      75         res=res/i*(i-1);
      76         while(!(a%i)) a/=i;
      77     }
      78     if(a>1) res=res/a*(a-1);
      79     return res;
      80 }
      View Code
  • 相关阅读:
    Windows Server 2008 R2域控组策略设置禁用USB
    Windows Server 2008 R2组策略设置计算机配置和用户配置
    Windows Server 2008 R2父域管理员与子域管理员相互登录访问
    转载:如何处理浏览器的断网情况?
    转载:浏览器缓存库设计总结(localStorage/indexedDB)
    手写启动一个本地服务器的命令行工具
    Node.js-核心模块-zlib
    使用console.log打印公司招聘信息和字符画
    转载:准备刷 leetcode 了,才发现自己连时间复杂度都不懂
    转载:前端通信那些事儿
  • 原文地址:https://www.cnblogs.com/btcadmire123A/p/11249237.html
Copyright © 2011-2022 走看看