四、数论
1.x的二进制长度
语法:
result=BitLength(int x);
参数:
x:测长的x
返回值:
x的二进制长度
源程序:
int BitLength(int x)
{
int d = 0;
while (x > 0) {
x >>= 1;
d++;
}
return d;
}
2.返回x的二进制表示中从低到高的第i位
语法:
result=BitAt(int x, int i);
参数:
x:十进制 x
i:要求二进制的第i位
返回值:
返回x的二进制表示中从低到高的第i位
注意:
最低位为第一位
源程序:
int BitAt(int x, int i)
{
return ( x & (1 << (i-1)) );
}
3.模取幂运算
语法:
result=Modular_Expoent(int a,int b,int n);
参数:
a、b、n:a^b mod n 的对应参数
返回值:
a^b mod n 的值
注意:
需要BitLength和BitAt
源程序:
int Modular_Expoent(int a,int b,int n)
{
int i, y=1;
for (i = BitLength(b); i > 0; i--)
{
y = (y*y)%n;
if (BitAt(b,i) > 0)
y = (y*a)%n;
}
return y;
}
4.求解模线性方程
语法:
result=modular_equation(int a,int b,int n);
参数:
a、b、n:ax=b (mod n) 的对应参数
返回值:
方程的解
源程序:
int ext_euclid(int a,int b,int &x,int &y) //求gcd(a,b)=ax+by
{
int t,d;
if (b==0) {x=1;y=0;return a;}
d=ext_euclid(b,a %b,x,y);
t=x;
x=y;
y=t-a/b*y;
return d;
}
void modular_equation(int a,int b,int n)
{
int e,i,d;
int x,y;
d=ext_euclid(a,n,x,y);
if (b%d>0)
printf("No answer!/n");
else
{
e=(x*(b/d))%n;
for (i=0;i<d;i++)
printf("The %dth answer is : %ld/n",i+1,(e+i*(n/d))%n);
}
}
5.求解模线性方程组(中国余数定理)
语法:
result=Modular_Expoent(int a,int b,int n);
参数:
B[]、W[]:a=B[] (mod W[]) 的对应参数
返回值:
a 的值
注意:
其中W[],B[]已知,W[i]>0且W[i]与W[j]互质, 求a
源程序:
int ext_euclid(int a,int b,int &x,int &y) //求gcd(a,b)=ax+by
{
int t,d;
if (b==0) {x=1;y=0;return a;}
d=ext_euclid(b,a %b,x,y);
t=x;
x=y;
y=t-a/b*y;
return d;
}
int China(int B[],int W[],int k)
{
int i;
int d,x,y,a=0,m,n=1;
for (i=0;i<k;i++)
n*=W[i];
for (i=0;i<k;i++)
{
m=n/W[i];
d=ext_euclid(W[i],m,x,y);
a=(a+y*m*B[i])%n;
}
if (a>0) return a;
else return(a+n);
}
6.筛法素数产生器
语法:
result=prime(int a[],int n);
参数:
a[]:用于返回素数的数组
n:产生n以内的素数,按升序放入a[]中
返回值:
n以内素数的个数
注意:
其中W[],B[]已知,W[i]>0且W[i]与W[j]互质, 求a
源程序:
int prime(int a[],int n)
{
int i,j,k,x,num,*b;
n++;
n/=2;
b=(int *)malloc(sizeof(int)*(n+1)*2);
a[0]=2;a[1]=3;num=2;
for(i=1;i<=2*n;i++)
b[i]=0;
for(i=3;i<=n;i+=3)
for(j=0;j<2;j++)
{
x=2*(i+j)-1;
while(b[x]==0)
{
a[num++]=x;
for(k=x;k<=2*n;k+=x)
b[k]=1;
}
}
return num;
}
7.判断一个数是否素数
语法:
result=comp(int n);
参数:
n:判断n是否素数
返回值:
素数返回1,否则返回0
源程序:
int comp(int n)
{
int i,flag=1;
for (i=2;i<=sqrt(n);i++)
if (n%i==0) {flag=0;break;}
if (flag==1) return 1; else return 0;
}