设为首页 加入收藏

TOP

HDU 2650 A math problem 高斯整数判定(一)
2015-11-21 01:01:29 来源: 作者: 【 】 浏览:8
Tags:HDU 2650 math problem 高斯 整数 判定

?

?

我们把集合:data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_10meh__.jpg叫做高斯整数环,其中Z表示通常的整数环,而用data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_wcqnm__.jpg表示复数域上的整数环。

?

那么什么是环呢?就是通过加减乘三种运算后,仍然能满足本身性质的就叫做环。

?

?

范的定义:设data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_xpuwj__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_zwqfv__.jpg,定义a的范为data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_ss6x8__.jpg

?

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_33x2a__.jpg,则

?

(1)data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_wegsn__.jpg为非负整数,并且data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_xzgvm__.jpg

?

(2)data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_udr8u__.jpg

?

(3)若data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_q8d1f__.jpg,则data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_divk7__.jpg

?

?

?

逆的定义:设data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_3c5iv__.jpg,如果存在data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_negbk__.jpg,使得data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_lmpm1__.jpg,则称data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_j1n37__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_dzxlm__.jpg中的乘法可逆元,简称可逆元,并且

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_gxsds__.jpg叫做data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_hcija__.jpg的逆。

?

高斯整数data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_iy0im__.jpg是可逆元的充要条件是:data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_hv6xi__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_xxvkk__.jpg中只有4个可逆元,分别是:data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_c5tur__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_wboig__.jpg

?

?

定义:设data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_3crd1__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_sqv2f__.jpg是两个非零高斯整数,如果存在可逆元data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_go9rr__.jpg,使得data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_uxxnm__.jpg,则称data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_dlxzu__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_eyehw__.jpg等价,并表示成data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_d6jyv__.jpg,换句话说,

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_t0e8f__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_ygqyw__.jpg等价,是指data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_1fqsy__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_jnvnu__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_vddrc__.jpg或者data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_ot8uz__.jpg

?

?

?

高斯素数

定义:设data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_dscld__.jpgdata-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_qw3i1__.jpg中的非零非可逆元,我们称data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_iabux__.jpg为高斯素数,是指data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_czduu__.jpg的每个因子或者为可逆元,或者是与data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_lh16o__.jpg等价的高斯整数。

?

引理:

(1)设data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_pmmii__.jpg为高斯整数,并且data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_qs28t__.jpg为素数,则data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_kgxcg__.jpg必定为高斯素数。

(2)若data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_eda06__.jpg为高斯素数,则其共轭元data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_jnze7__.jpg也是高斯素数。

?

?

如何判断一个高斯整数是否属于高斯素数呢?可以用下面的方法:

?

高斯整数data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_ho8b3__.jpg是素数当且仅当:

(1)a、b中有一个是零,另一个数的绝对值是形如4n+3的素数;

(2)a、b均不为零,而data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_n2xo9__.jpg为素数;

?

有了这个结论,那么我们就可以很轻松的解决HDU2650题了。

?

题目:A math problem

?

题意:给出data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_z3g79__.jpg,其中data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_ptzru__.jpg,判断data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_qfmap__.jpg是否为高斯素数。

?

分析:其实就是上面的判断高斯素数的方法,但是注意一点,这里data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_yt1zo__.jpg,而正常情况是data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_ceooa__.jpg,其实差不多一样,

只是把data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_neld1__.jpg为素数这个条件改为:data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_qgihv__.jpg为素数即可,那么如果把题目描述改为data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_zthmo__.jpg呢?同样的道理只需把

判断条件改成data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_hkttm__.jpg为素数即可,由于data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_b9aii__.jpg很大,所以写个Miller_Rabin吧。。。


?

?

import java.text.DecimalFormat;
import java.util.ArrayDeque;
import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.math.BigInteger;  
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Deque;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Random;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Queue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class Main{
	long multi(long a,long b,long m)  
	{  
	     long ans=0;  
	     while(b>0)  
	     {  
	         if((b&1)!=0)  
	         {  
	             ans=(ans+a)%m;  
	             b--;  
	         }  
	         b/=2;
	         a=(a+a)%m;  
	     }  
	     return ans;  
	}  
	  
	long quick_mod(long a,long b,long m)  
	{  
	     long ans=1;  
	     a%=m;  
	     while(b>0)  
	     {  
	         if((b&1)!=0)  
	         {  
	             ans=multi(ans,a,m);  
	             b--;  
	         }  
	         b/=2;  
	         a=multi(a,a,m);  
	     }  
	     return ans;  
	}  
	  
	boolean MillarRabin(long n)  
	{  
	    if(n==2) return true;  
	    if(n<2||0==(n&1)) return false;  
	    long a,m=n-1,x,y = 0;  
	    int k=0;  
	    while((m&1)==0)  
	    {  
	        k++;  
	        m/=2;  
	    }  
	    for(int i=0;i<10;i++)  
	    {  
	        a=abs(rand.nextLong())%(n-1)+1; 
	        x=quick_mod(a,m,n);  
	        for(int j=0;j
  
   > 1;
			if (A[mid] <= val) {
				l = mid + 1;
			} else {
				pos = mid;
				r = mid - 1;
			}
		}
		return pos;
	}

	int Pow(int x, int y) {
		int ans = 1;
		while (y > 0) {
			if ((y & 1) > 0)
				ans *= x;
			y >>= 1;
			x = x * x;
		}
		return ans;
	}
	double Pow(double x, int y) {
		double ans = 1;
		while (y > 0) {
			if ((y & 1) > 0)
				ans *= x;
			y >>= 1;
			x = x * x;
		}
		return ans;
	}
	int Pow_Mod(int x, int y, int mod) {
		int ans = 1;
		while (y > 0) {
			if ((y & 1) > 0)
				ans *= x;
			ans %= mod;
			y >>= 1;
			x = x * x;
			x %= mod;
		}
		return ans;
	}
	long Pow(long x, long y) {
		long ans = 1;
		while (y > 0) {
			if ((y & 1) > 0)
				ans *= x;
			y >>= 1;
			x = x * x;
		}
		return ans;
	}
	long Pow_Mod(long x, long y, long mod) {
		long ans = 1;
		while (y > 0) {
			if ((y & 1) > 0)
				ans *= x;
			ans %= mod;
			y >>= 1;
			x = x * x;
			x %= mod;
		}
		return ans;
	}

	int Gcd(int x, int y){
		if(x>y){int tmp = x; x = y; y = tmp;}
		while(x>0){
			y %= x;
			int tmp = x; x = y; y = tmp;
		}
		return y;
	}
	long Gcd(long x, long y){
		if(x>y){long tmp = x; x = y; y = tmp;}
		while(x>0){
			y %= x;
			long tmp = x; x = y; y = tmp;
		}
		return y;
	}
	int Lcm(int x, int y){
		return x/Gcd(x, y)*y;
	}
	long Lcm(long x, long y){
		return x/Gcd(x, y)*y;
	}
	int max(int x, int y) {
		return x > y ? x : y;
	}

	int min(int x, int y) {
		return x < y ? x : y;
	}

	double max(double x, double y) {
		return x > y ? x : y;
	}

	do
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++对象模型之简述C++对象的内存.. 下一篇UVALive 6439--Pasti Pas!

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: