Mathematics & Programme

返回主页<-

初等数论
·  因数分解

·  最大公约数&最小公倍数

·  素数(质数)

因数分解            {一个计算120位因式分解(因数>65535不予处理)的程序}
 

通法是试除.

对于特殊的如 2^p-1 的数有高效一些的方法:

1, 先找出小的因数, 例如我们要试 223-1 能否被47整除, 先使23转为二进制10111,  设初值 1 , 反复平方, 并移去指数的二进制的高位, 若刚移去的高位是1 , 将刚平方的数乘 2, 然后计算它除以47的余数:

平方

移去高位

乘 2

mod 4

1*1 = 1

1  0111

1*2 = 2

2

2*2 = 4

0   111

no

4

4*4 = 16

1    11

16*2 = 32

32

32*32 = 1024

1     1

1024*2 = 2048

27

27*27 = 729

1

729*2 = 1458

1

 故 223 = 1 mod 47. 两边减1 223-1 = 0 mod 47. 就是说 223-1 有因 47.

麦森数有一个很好的性质, 2P-1 的任何一个因数有形式 2kp+1 且 q=1 or 7 mod 8 , 而2P-1有95%的因数在40000以下. 

2, 先精选一个限度B1, 将所有小于B1的素数相乘得E, 算 x = 3E*2*P, 检查GCD(x-1, 2P-1)

3, Lucas-Lehmer 素数测试法:
  L(1) = 4
  L(n+1) = (2L(n) - 2) mod (p2 - 1)
  当且仅当 L[p-1] = 0 时 2^p-1 是素数.

更多分解法

最大公约数&最小公倍数  {俩小整数GCD,LCM的程序}
 

求a、b的最大公约数GCD:

 1.质因数分解法:

    1, 对两数分别分解质因数;

    2, 找出共有的因数, 其乘积即是它们的最大公约数.

 2.辗转相除法:

    1, 若 a>b 执行<2>, 否则交换 a,b 执行<2>. 

    2, a <- a mod b

    3, 若a或b等于一, 则另一个数是它们的最大公约数.否则执行<1>. 

求a、b的最小公倍数LCM:

    最小公倍数=ab÷最大公约数

对于求n个数的最大公约数&最小公倍数, 需分别求出每两个数的最大公约数(最小公倍数)将结果作同样处理. 

素数(质数)        {可以找100000000以内的素数的程序}
 

   找它们的方法, 主要是用筛选法, 即除去2、3、5、7、11、……的倍数, 剩下的就是素数. 

  有一类素数叫梅森数或麦森数(Mersenne number) 它是形如2^p-1的素数.关于它的判定在因数分解有介绍. 

 

交流:  留言本 or xyy82148@163.com