#include
#include
#include
using namespace std;
bool is_prime(long p)
{
if( p<2 ) return false;
for(int i=2; i*i<=p; i++)
if ( p%i==0 )
return false;
return true;
}
bool is_4n_plus_3( long a ) { return a%4 == 3 ; }
bool is_gausian_prime( std::complex
{
const long a = std::abs( z.real() ) ;
const long b = std::abs( z.imag() ) ;
if( a == 0 ) return is_prime(b) && is_4n_plus_3(b) ;
else if( b == 0 ) return is_prime(a) && is_4n_plus_3(a) ;
else return is_prime( a*a + b*b ) ;
}
/*
自然数集与整数集一一对应:当n为偶数时,对应到n/2; n为奇数时对应到1-(n+1)/2
0,1,-1,……
有限多个可数集的笛卡尔积是可数的。
Z[i]可数:按范数升序和幅角主值升序排列
0,1,i,-1,-i,1+i,-1+i,-1-i,1-i,……
高斯整數和普通整數相像,也是惟一分解 (Unique Factorization) 的。除去因子的次序、單位 + 1、 - 1 、 + i 、 - i 及相伴元以外的分解是惟一的。在高斯整數的世界中,型如 4k-1 的素數 (如 3、7、11、19、23、......) 仍為素數,但其他的則可進一步分解成其他高斯素數:
2 = (1+i) (1-i) 5 = (2+i) (2-i) 13 = (2+3i) (2-3i)
17 = (4+i) (4-i) 29 = (5+2i) (5-2i) 37 = (6+i) (6-i)
現在我們知道在實軸 (Real Axis) 及虛軸 (Imaginary Axis) 上存在無限多個高斯素數,因為虛軸上的高斯素數不過是實軸的高斯素數的相伴元。但在複平面 (Complex Plane) 上別的直線又如何呢?例如所有型如 (1 + ki) 的高斯素數是否均存有無限多個呢?仍是存疑。
某些素数并非高斯素数,如2=(1+i)(1-i)及5=(2+i)(2-i)。
4除余3的素数都是高斯素数,4除余1者则否,因为后者能表示成两个平方数之和:
p=a^2+b^2=(a+bi)(a-bi)
若某个高斯整数的范数是素数,该高斯整数是高斯素数。
A complex number a + bj where a and b are integers is a Gaussian prime if the factors are 1, -1, -a - bj and a + bj only.
The following are Gaussian primes: 1 + j, 1 - j, 1 + 2j, 1 - 2j, 3 and 7.
The Gaussian prime factors of 5 are:
1 + 2j and 1 - 2j, or
2 + j and 2 - j, or
-1 - 2j and -1 + 2j, or
-2 - j and -2 + j.
求证范数小于100,1/4正平面(0<=θ<π/2)上所有“高斯素数”
1+1I 1+2I 2+1I 3 2+3I 3+2I 1+4I 4+1I 2+5I 5+2I 1+6I 6+1I
4+5I 5+4I 7 2+7I 7+2I 5+6I 6+5I 3+8I 8+3I 5+8I 8+5I 4+9I 9+4I
高斯素数是指除了单位{1,-1,i,-i}及其自身与单位的乘积,不能被其他高斯整数除尽。
找高斯素数我觉得也不很难,只要得出正平面(0<=θ<π/2)上的高斯素数,然后乘上单位
{-1,i,-i}就能得出其他三个平面上的高斯素数。可以看出高斯素数是关于原点对称的。
*/
class gint
{
public:
gint(long a,long b)
{
m_a=a;
m_b=b;
}
static bool IsPrime(gint N)
{
return is_gausian_prime(complex
}
friend ostream& operator<< (ostream& os,gint& N);
public:
long m_a;
long m_b;
};
ostream& operator<< (ostream& os,gint& N)
{
string strDes=(gint::IsPrime(N)?"是高斯素数":"不是高斯素数");
if(N.m_a!=0 && N.m_b>0)
cout<
cout<
cout<
cout<
}
unsigned int Primes[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,
107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,
337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,
593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,
857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
int main(void)
{
for(int i=0;i
return 0;
}
/*
前20以内+8
20~60 +9
60~100 +8
100~140 +9
140~180 +8
180~220 +9
=>第100个质数为449【实际上Primes[99]=541】
1000以内有质数216个【实际上有168个】
质概率P(n)=1.0625/5(n->∞)
*/
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
unsigned int Primes[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,
107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,
337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,
593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,
857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
//unsigned int Primes[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107
//,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223
//,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337
//,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457
//,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593
//,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719
//,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857
//,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
namespace math
{
typedef unsigned long DWORD;
//函数decomp_integer对n分解素因数,分解后的素数存入facArr数组,并返回因子的个数
int decomp_integer( DWORD n, DWORD facArr[])
{
DWORD fac; //n的可能的一个因子
int count;
if (n<4) //4以内的数,不需要分解
{
facArr[0]=n; return 1;
}
count=0;
//下面的while循环为2试出n,直到2不是n的因子为止
while ( (n & 1)==0) // 这里判断偶数用 (n &1)==0,这比(n % 2)==0更快
{
facArr[count++]=2; n/=2;
}
fac=3; //用3到sqrt(n)之间的奇数试除
while (fac*fac<=n) // fac*fac <= n
{
while (n % fac==0)
{
facArr[count++]=fac;
n /= fac;
}
fac+=2;
}
if (n==1)
return count;
facArr[count++]=n;
return count;
}
void UFD(unsigned int N,vector
{
DWORD facArray[32];
int count=decomp_integer(N,facArray);
for(int i=0;i
vecP.insert(vecP.end(),vecMP.begin(), vecMP.end());
vecP.erase(unique(vecP.begin(),vecP.end()),vecP.end());
vecA.resize(vecP.size());
for(int i=0;i
vecA[i]=std::count(vecMP.begin(), vecMP.end(),vecP[i]);
}
}
/*
EulerPhi(1)=1
EulerPhi(2)=1
EulerPhi(3)=2
EulerPhi(4)=2
EulerPhi(5)=4
EulerPhi(6)=2
EulerPhi(7)=6
EulerPhi(8)=4
EulerPhi(9)=6
EulerPhi(10)=4
EulerPhi(11)=10
EulerPhi(12)=4
*/
/*
定义:给定正整数M,不大于M并与M互素的正整数的个数记作φ(M),称φ(M)为欧拉函数。
φ(1)=1,φ(2)=1,φ(3)=2,φ(p)=p-1(p设为素数)
M=12=2^2?3,则φ(M)=12(1-1/2)(1-1/3)=4。
若a和b是任意两个互素的正整数,则φ(ab)=φ(a)?φ(b)。
*/
unsigned int EulerPhi(unsigned int N)
{
if(N==1)
return 1;
vector
math::UFD(N,vecMP,vecP,vecA);
unsigned int ret=N;
for(int i=0;i
ret=ret*(vecP[i]-1)/vecP[i];
}
return ret;
}
}
bool IsPrime(unsigned int N)
{
for(int i=2;i<=sqrt((float)N);i++)
if(N%i==0)
return false;
//else
// continue;
return true;
}
int main(void)
{
//for(int i=2;i<50000;i++)
// if(IsPrime(i))
// printf("%d,",i);
//printf("%d\n",sizeof(Primes)/sizeof(unsigned int));
//printf("Primes[99]=%d\n",Primes[99]);
unsigned int N=300;//72;
vector
math::UFD(N,vecMP,vecP,vecA);
system("pause");
return 0;
}
{
if((i*i-a)%p==0)
{
return 1;//a是p的二次剩余
}
}
return -1;//a是p的二次非剩余
}
{
if((i*i*i*i-a)%p==0)
{
return 1;//a是p的四次剩余
}
}
return -1;//a是p的四次非剩余
}
public static int Eisenstein(int a,int p)
{
if(a%p==0)
return 0;//a是p的倍数
for(int i=1;i
{
if((i*i*i-a)%p==0)
{
return 1;//a是p的三次剩余
}
}
return -1;//a是p的三次非剩余
}
{
if((i*i-t)%p==0)
{
return 1;
}
}
return -1;//t是p的二次非剩余
}
{
complex
z+=complex
}
return z;
}
{
cout<<"gauss(a="< }
}
#endif
。而且,如果degp(x)=n,那么F(a)中的元都能惟一地表为如下的形式c_(n-1)a^(n-1)+c_(n-2)a^(n-2)+…+c_1a+c_0,其中c_0,c_1,…,c_(n-1)∈F。
{
{
20130622问题:证明在有限域中存在不可分多项式?
20130621问题:设a是F_2[x]中不可约多项式x^3+x+1的一个根,求扩域F_2(a)及x^3+x+1的另外两个根b=b(0,1,a),c=c(0,1,a)?
解答:
F_2(a)={0=O,1=I,a=D,a^2=A,1+a=E,1+a^2=C,a+a^2=B,1+a+a^2=F},另外两个根为:b=a^2,c=a+a^2。
----加法运算表----
O+O=O O+I=I O+A=A O+B=B O+C=C O+D=D O+E=E O+F=F
I+O=I I+I=O I+A=C I+B=F I+C=A I+D=E I+E=D I+F=B
A+O=A A+I=C A+A=O A+B=D A+C=I A+D=B A+E=F A+F=E
B+O=B B+I=F B+A=D B+B=O B+C=E B+D=A B+E=C B+F=I
C+O=C C+I=A C+A=I C+B=E C+C=O C+D=F C+E=B C+F=D
D+O=D D+I=E D+A=B D+B=A D+C=F D+D=O D+E=I D+F=C
E+O=E E+I=D E+A=F E+B=C E+C=B E+D=I E+E=O E+F=A
F+O=F F+I=B F+A=E F+B=I F+C=D F+D=C F+E=A F+F=O
----乘法运算表----
O*O=O O*I=O O*A=O O*B=O O*C=O O*D=O O*E=O O*F=O
I*O=O I*I=I I*A=A I*B=B I*C=C I*D=D I*E=E I*F=F
A*O=O A*I=A A*A=B A*B=C A*C=D A*D=E A*E=F A*F=I
B*O=O B*I=B B*A=C B*B=D B*C=E B*D=F B*E=I B*F=A
C*O=O C*I=C C*A=D C*B=E C*C=F C*D=I C*E=A C*F=B
D*O=O D*I=D D*A=E D*B=F D*C=I D*D=A D*E=B D*F=C
E*O=O E*I=E E*A=F E*B=I E*C=A E*D=B E*E=C E*F=D
F*O=O F*I=F F*A=I F*B=A F*C=B F*D=C F*E=D F*F=E
----减法运算表----
O-O=O O-I=I O-A=A O-B=B O-C=C O-D=D O-E=E O-F=F
I-O=I I-I=O I-A=C I-B=F I-C=A I-D=E I-E=D I-F=B
A-O=A A-I=C A-A=O A-B=D A-C=I A-D=B A-E=F A-F=E
B-O=B B-I=F B-A=D B-B=O B-C=E B-D=A B-E=C B-F=I
C-O=C C-I=A C-A=I C-B=E C-C=O C-D=F C-E=B C-F=D
D-O=D D-I=E D-A=B D-B=A D-C=F D-D=O D-E=I D-F=C
E-O=E E-I=D E-A=F E-B=C E-C=B E-D=I E-E=O E-F=A
F-O=F F-I=B F-A=E F-B=I F-C=D F-D=C F-E=A F-F=O
关键推导过程:
O*O*O+O+I=I
I*I*I+I+I=I
A*A*A+A+I=O
B*B*B+B+I=O
C*C*C+C+I=D
D*D*D+D+I=O
E*E*E+E+I=B
F*F*F+F+I=A
所以三个根a,b,c为A,B,D
令0=O,1=I,
错误的:a=A,a^2=B,1+a=C=a^3,
错误的:a=B,a^2=D,1+a=F=a^3,
正确的:a=D,a^2=A,1+a=E=aA,1-a=E=>a=-a,1+a^2=C,a+a^2=B,1+a+a^2=F=I+F
错误的:a=C,a^2=F,1+a=A=aE,1-a=A,=>a=-a,1+a^2=B,a+a^2=D,1+a+a^2=E=A+F
即:八元域F_2(a)={O=0,I=1,D=a,A=a^2,E=1+a,C=1+a^2,B=a+a^2,F=1+a+a^2},
而不是{O=0,I=1,C=a,F=a^2,A=1+a,B=1+a^2,D=a+a^2,E=1+a+a^2}。
F_2的扩域记为F_2(a)=F_2(a=D,b=A=a^2,c=B=a+a^2)
另外两个根为:b=a^2,c=a+a^2。
三根满足关系:
x^3+x+1=x^3-(a+b+c)x^2+(ab-ac-bc)x-abc
D+A+B=O<=>a+b+c=0
DAB=I=-I<=>abc=1=-1
DA-DB-AB=I<=>ab-ac-bc=1
D^3+D=I<=>a^3+a=1
DA(-D-A)=I<=>ab(-a-b)=1
#include
#include
#include
using namespace std;
/*
练习作业
1.方程x^2+1=0在有理数域中没有根,问在有限域F_5中有没有根,有几个根?
2.记F=F_2是含2个元素的域,证明多项式x^2+1在多项式环F[x]中可约,而x^2+x+1在多项式环F[x]中不可约。
3.假定F=F_2,α是F[x]中不可约多项式x^2+x+1的一个根,证明F(α)={0,1,α,1+α}是一个含4个元素的域。求多项式x^2+x+1的另一个根。
4.假定F=F_2,求F[x]中所有3次不可约多项式。
在有限域F_2中,5次不可约多项式x^5+x^2+1的[模乘法]阶是31=2^5-1。
F_2中1-5次不可约多项式列表:
1,1+x,x
2,1+x+x^2
3,1+x+x^3,1+x^2+x^3
4,1+x+x^4,1+x+x^2+x^3+x^4,1+x^3+x^4
5,1+x^2+x^5,1+x+x^2+x^3+x^5,1+x^3+x^5,1+x+x^3+x^4+x^5,1+x^2+x^3+x^4+x^5,1+x+x^2+x^4+x^5
*/
【
在F_2中,
x^3+1=(x-1)^3,
x^3+x+1=(x-a)(x-b)(x-c)
x^3+x^2+1=(x-a)(x-b)(x-c)
x^2+1=(x-1)^2,
[
x^2+x+1=(x-a)(x-b)=x^2-(a+b)x+ab,
F_2的扩域记为F_2(a)=F_2(a,b),a(a+1)=a^2+a=a+b=1=-1,ab=1。
b=a^2=(a+1),a^3=1
所以F_2(a)={0,1,a,1+a}
]
】
template
template
{
cout<
}
int F_5[5]={0,1,2,3,4};
int Mod(int ret,unsigned int n)
{
assert(n>0);
if(ret<0)
{
int ret1=ret+(-ret+1)*n;
return ret1%n;
}
return ret%n;
}
int Mod5(int ret)
{
//while(ret<0)
//{
// ret+=5;
// if(ret>=0)
// return ret;
//}
// return ret%5;
return Mod(ret,5);
}
int AddInF5(int a,int b)
{
int ret=Mod5(a+b);
return ret;
}
int MulInF5(int a,int b)
{
int ret=Mod5(a*b);
return ret;
}
int AddInvInF5(int a)
{
static int F_5[5]={0,1,2,3,4};
for(int i=0;i<5;i++)
{
if(AddInF5(F_5[i],Mod5(a))==0)
return F_5[i];
}
return -1;//错误值
}
int MulInvInF5(int a)
{
static int F_5[5]={0,1,2,3,4};
for(int i=0;i<5;i++)
{
if(MulInF5(F_5[i],Mod5(a))==1)
return F_5[i];
}
return -1;//错误值
}
typedef void(*pFuncVoid)(void);
typedef int(*pFuncInt0)(int x);
int Polygon(int x)
{
return x*x+1;
}
vector
{
vector
if(fun!=NULL)
{
static int F_5[5]={0,1,2,3,4};
for(int i=0;i<5;i++)
{
if(Mod5(fun(F_5[i]))==0)
ret.push_back(F_5[i]);
}
}
return ret;
}
int main()
{
vector
//int ret1=(-2)%5;
//int ret2=(-10)%5;
//int ret3=Mod5(-2);
//int ret4=Mod5(-7);
//int ret5=Mod(-2,5);
//int ret6=Mod(-7,5);
system("pause");
return 0;
}
#include
#include
#include
using namespace std;
/*
系数属于F_3={0,1,2}的所有有实际意义的二次方程。
方程,因式分解,解
x^2+1=0,不可分解,无解
x^2+2=0,(x+1)(x+2),x=1,x=2
x^2+x+1=0,(x+2)(x+2),x=1
x^2+x+2=0,不可分解,无解
x^2+2x+1=0,(x+1)(x+1),x=2
x^2+2x+2=0,不可分解,无解
在我研究的这个域内没有解的方程称为不可约的。你可以看到系数在0,1,2域中的六个有意义的方程中有三个是不可约的。
*/
/*
系数属于F_2={0,1}的所有有实际意义的三次、二次方程。
方程,因式分解,解
x^3+1=0,在F_2中有一根:x_1=1
x^3+x+1=0,在F_2中无根
x^3+x^2+1=0,在F_2中无根
x^3+x^2+x+1=0,在F_2中有一根:x_1=1
x^2+1=0,在F_2中有一根:x_1=1
x^2+x+1=0,在F_2中无根
在我研究的这个域内没有解的方程称为不可约的。你可以看到系数在0,1域中的六个有意义的方程中有三个是不可约的。
*/
int Mod(int ret,unsigned int n)
{
assert(n>0);
if(ret<0)
{
int ret1=ret+(-ret+1)*n;
return ret1%n;
}
return ret%n;
}
int Mod3(int ret)
{
return Mod(ret,3);
}
//int AddInF3(int a,int b)
//{
// int ret=Mod3(a+b);
// return ret;
//}
//int MulInF3(int a,int b)
//{
// int ret=Mod3(a*b);
// return ret;
//}
//int AddInvInF3(int a)
//{
// for(int i=0;i<3;i++)
// {
// if(AddInF3(i,Mod3(a))==0)
// return i;
// }
// return -1;//错误值
//}
//int MulInvInF3(int a)
//{
// for(int i=0;i<5;i++)
// {
// if(MulInF3(i,Mod3(a))==1)
// return i;
// }
// return -1;//错误值
//}
typedef void(*pFuncVoid)(void);
typedef int(*pFuncInt0)(int x);
typedef int(*pFuncInt2)(int x,int a1,int a0);
typedef int(*pFuncInt3)(int x,int a2,int a1,int a0);
int Polygon2(int x,int a1,int a0)
{
return x*x+a1*x+a0;
}
int Polygon3(int x,int a2,int a1,int a0)
{
return x*x*x+a2*x*x+a1*x+a0;
}
vector
{
vector
if(fun!=NULL)
{
for(int i=0;i<3;i++)
{
if(Mod3(fun(i,a1,a0))==0)
ret.push_back(i);
}
}
return ret;
}
//通用的代码
vector
{
vector
if(fun!=NULL)
{
for(int i=0;i
if(Mod(fun(i,a1,a0),p)==0)
ret.push_back(i);
}
}
return ret;
}
vector
{
vector
if(fun!=NULL)
{
for(int i=0;i
if(Mod(fun(i,a2,a1,a0),p)==0)
ret.push_back(i);
}
}
return ret;
}
int main()
{
vector
vector
vector
vector
vector
vector
//x^3+1=0,
//x^3+x+1=0,
//x^3+x^2+1=0,
//x^3+x^2+x+1=0,
//x^2+1=0,
//x^2+x+1=0,
vector
vector
vector
vector
vector
vector
system("pause");
return 0;
}