首页 > 技术文章 > 素数

lyf123456 2013-11-02 14:45 原文

整除的定义:设a,b是两个整数,且b≠0。如果存在整数c,使a=bc,则称a被b整除,记作b|a。

素数的定义:如果正整数a大于1且只能被1和它自己整除,则称a是素数;如果a大于1且不是素数,则称a是合数,素数也叫做质数。

合数的一个性质:合数必有素数因子,即设a是一个合数,则存在素数p,使得p|a。

算术基本定理:设a>1,则

                    a=p1^r1p2^r2p3^r3...pk^rk,其中p1,p2,p3...pk是不相同的素数,r1,r2....rk是正整数(其实ri也可以为0),并且不计顺序的情况下,该表示是惟一的。该表达式也叫做a的素因子分解。 

推论:设 a=p1^r1p2^r2p3^r3...pk^rk,其中p1,p2,p3...pk是不相同的素数,r1,r2....rk是正整数,则正整数d为a的因子的充分必要条件是

                  d=p1^s1p2^s2...pk^sk,其中0<=si<=ri,i=1,2,3...k。

例题:(1)99099有多少个正因子?

          解:99099=3^2*7*11^2*13.由推论可知99099的正因子个数为  3*2*3*2=36.(所有素因子的组合,3,7,11,13的个数取值分别为3,2,3,2。例如,3的个数可以为0,1,2。)

         (2)20!的二进制表示中从低位数起有多少个连续的0?

          解:只需求20!含有多少个因子2。不超过20的含有因子2的数(即偶数),有2,4=2^2,6=2*3,8=2^3,10=2*5,12=2^2*3,14=2*7,16=2^4,18=2*9,20=2^2*5。一共有18个,故20!含有18个因子2,则20!的二进制表示中从低位数起有18个连续的0.

推论:任何一个正整数n,n!的二进制表示从最低位数起,连续0的个数等于n!含有多少个因子2。

推论:如果a是一个合数,则a必有一个小于等于√a ̄的素因子。

记P(n)为小于等于n的素数个数,则有P(100)=25,P(10^3)=(145~168),P(10^4)=(1086~1229),P(10^5)=(8686~9592),P(10^6)=(72382~78498),P(10^7)=(620421~6644579)。

素数的筛法(埃拉托尼斯筛法)

代码实现:

#include<stdio.h>
#include<string.h>
#define maxn 100000
int isprime[maxn],prime[maxn],nprime;
int main()
{
    __int64 i,j;
    nprime=0;
    memset(isprime,1,sizeof(isprime));
    isprime[1]=0;
    isprime[0]=0;
    for(i=2;i<=maxn;i++)
    {
        if(isprime[i])
        {
            prime[nprime++]=i;
            for(j=i*i;j<maxn;j+=i)
                isprime[j]=0;
        }
    }
    for(int k=0;k<nprime;k++)
        printf("%d ",prime[k]);
    return 0;
}

 数a和b互素的充分必要条件是存在整数x和y使得xa+yb=1.

推荐阅读