码迷,mamicode.com
首页 > 其他好文 > 详细

数论总结 2012-09-05

时间:2016-03-02 21:49:05      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

比较愚钝,一点点数论花了好长时间才弄明白,小小总结下。

①最大公约数 (辗转相除法)

    Function gcd(a,b:longint):longint;

     begin

           if b=0 then gcd:=a 

                      else gcd:=gcd(b,a mod b);   

     end;

②最小公倍数

      lcm(a,b)*gcd(a,b)=a*b

      lcm(a,b)=a*b/gcd(a,b);

③素数表

      筛法

④素数测试

      Miller-Rabbin测试 :

                      如 果存在和n互质的正整数a  满足 a^(n-1)=1(mod n) (费马小定理推得),则称n为基于a的伪素数。不断选取不超过 n-1的 基 b (s次),计算是否每次都有 b^(n-1)=1 (mod n)。若每次都成立则几乎可以断定 n为素数。    (摘自《算法艺术与信息学竞 赛》)

⑤扩展欧几里德

        如果  d=gcd(a,b) 那么一定存在 x,y 使得  ax+by=d。

        Function extended_gcd(a,b:longint;var x,y:longint):longint;

        var k:longint;

         begin

                if  b=0 then begin

                                            extended_gcd:=a;

                                            x:=1;y:=0; 

                                      end

                            else begin

                                            extended_gcd:=extended_gcd(b,a mod b,x,y);

                                            k:=x;

                                            x:=y;

                                            y:=k-(a div b)*y;

                                    end;                  

         end;     

      

⑥快速幂(非递归写法)

     Function  pow(k,q:longint):longint;

     begin

            pow:=1;

            while q<>0 do 

             begin

                     if q mod 2=1 then pow:=pow*k;

                     k:=k*k;

                     q:=q div 2;

             end;    

     end;

 

⑦线性模方程

       解 ax=c (mod b)  

         ax+by=c   

        设  d=gcd(a,b);

       则问题有整数解的充要条件为  c mod d=0

       令 a=a‘*d , b=b‘*d  

       则  gcd(a‘,b‘)=1   

       原方程可化为   a‘x+b‘y=c/d

       通过扩展欧几里德解  a‘x‘+b‘y‘=1 得出 x‘和y‘ 

       而 x=x‘*c/d   y=y‘*c/d

       但这只是其中一组解 mod b条件下所有的解为

             xi=x0+i*(b/d)   (i=1,2,3,.....,d-1)    x0为任意一个解

⑧线性模方程组

        解一系列   x=ai (mod bi)   (2<=i<=n)

       先考虑简单的情况    n=2的时候

             即     x=a1 (mod b1);

                     x=a2 (mod b2);

             即    x=a1+b1*y1

                     x=a2+b2*y2   

             a1+b1y1=a2+b2y2  -->   b1y1-b2y2=a2-a1

             很容易的转化成了线性模方程

             同样 令 d=gcd(b1,b2);

             线性方程组无解的情况即    (a2-a1) mod d<>0 

             同线性模方程 通过扩展欧几里德解出 y1,y2的值

             则x=a1+b1*y1=a2+b1*y2  也就解出了两个方程的解

             x的最小非负整数解为   x=((x mod lcm(b1,b2))+lcm(b1,b2))mod lcm(b1,b2);

             推广到多个方程组的情况

                       将两个方程组合并,即:  令两个方程得出的x值为q,

                                                             则合并成的新方程为   x=q (mod lcm(b1,b2));

             将所有方程两两合并,最终也就得出了最终的答案。

⑨中国剩余定理

         同样对于一系列   x=ai (mod bi)  (且所有的bi两两互质)

         x在模  b1*b2...bn 下有唯一解

         b=b1*b2*......*bn

         对于每一个bi 求出一个pi,pi=b/bi

         且  pi=1 (mod bi)

         即求解   pi*xi+bi*yi=1 ,易知 gcd(pi,bi)=1, 扩展欧几里德解之。

        而最终的答案即为  X=p1*x1* a1+p2*x2*a2+......+pn*xn*an

 

⑩乘法逆元

        ax=1 (mod b)    x存在当且仅当  gcd(a,b)=1

        x即为a的乘法逆元

        一般在计算模上的除法时,转换为乘上除数的乘法逆元

11.关于计算模上的除法

         由费马定理可知,当a,p互质时  a^p=a (mod p)--> a^(p-2)=a^-1 (mod p) 

         求   (1/a) mod p 即 a^-1 mod p=a^(p-2)  (mod p) 所以就求出了  (1/a)mod p

12.处理的模数不是质数又要处理除法

         把模数拆成pi^ci的积

         分别处理

         用中国剩余定理合并解答

13.欧拉函数

         φ(n)为小于等于n的数中与n互质的数的数目。

         n=p1^q1*p2^q2*p3^q3*...*pk^qk    (p为互异的质因数)

         φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*...*(1-1/pk)

         φ(n)为积性函数 如果 (a,b)=1 then φ(ab)=φ(a)φ(b)

         欧拉定理: (a,b)=1   a^φ(b)=1  (mod b)

14.约数和

        对与A的约数和

         A=p1^k1*p2^k2*...*pn^kn

         S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)

数论总结 2012-09-05

标签:

原文地址:http://www.cnblogs.com/yesphet/p/5236500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!