HDU2650(高斯整数环)
我們把集合:叫做高斯整數環,其中Z表示通常的整數環,而用表示復數域上的整數環。
?
那么什么是環呢?就是通過加減乘三種運算后,仍然能滿足本身性質的就叫做環。
?
?
范的定義:設,,定義a的范為
?
設,則
?
(1)為非負整數,并且
?
(2)
?
(3)若,則
?
?
?
逆的定義:設,如果存在,使得,則稱為中的乘法可逆元,簡稱可逆元,并且
叫做的逆。
?
高斯整數是可逆元的充要條件是:。????中只有4個可逆元,分別是:和
?
?
定義:設和是兩個非零高斯整數,如果存在可逆元,使得,則稱和等價,并表示成,換句話說,
與等價,是指,,或者
?
?
?
高斯素數
定義:設為中的非零非可逆元,我們稱為高斯素數,是指的每個因子或者為可逆元,或者是與等價的高斯整數。
?
引理:
(1)設為高斯整數,并且為素數,則必定為高斯素數。
(2)若為高斯素數,則其共軛元也是高斯素數。
?
?
如何判斷一個高斯整數是否屬于高斯素數呢?可以用下面的方法:
?
高斯整數是素數當且僅當:
(1)a、b中有一個是零,另一個數的絕對值是形如4n+3的素數;
(2)a、b均不為零,而為素數;
?
有了這個結論,那么我們就可以很輕松的解決HDU2650題了。
?
題目:A math problem
?
題意:給出,其中,判斷是否為高斯素數。
?
分析:其實就是上面的判斷高斯素數的方法,但是注意一點,這里,而正常情況是,其實差不多一樣,
只是把為素數這個條件改為:為素數即可,那么如果把題目描述改為呢?同樣的道理只需把
判斷條件改成為素數即可,由于很大,所以寫個Miller_Rabin吧。。。
?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream>const int Times=10;using namespace std; typedef long long LL;LL multi(LL a,LL b,LL m) {LL ans=0;while(b){if(b&1){ans=(ans+a)%m;b--;}b>>=1;a=(a+a)%m;}return ans; }LL quick_mod(LL a,LL b,LL m) {LL ans=1;a%=m;while(b){if(b&1){ans=multi(ans,a,m);b--;}b>>=1;a=multi(a,a,m);}return ans; }bool Miller_Rabin(LL n) {if(n==2) return true;if(n<2||!(n&1)) return false;LL a,m=n-1,x,y;int k=0;while((m&1)==0){k++;m>>=1;}for(int i=0;i<Times;i++){a=rand()%(n-1)+1;x=quick_mod(a,m,n);for(int j=0;j<k;j++){y=multi(x,x,n);if(y==1&&x!=1&&x!=n-1) return false;x=y;}if(y!=1) return false;}return true; }int main() {LL a,b;while(~scanf("%I64d%I64d",&a,&b)){if(a==0){if(b%4==3&&Miller_Rabin(b)) puts("Yes");else puts("No");}else{LL t=a*a+2*b*b;if(Miller_Rabin(t)) puts("Yes");else puts("No");}}return 0; }?
?
題目:http://poj.org/problem?id=3361
?
?
總結
以上是生活随笔為你收集整理的HDU2650(高斯整数环)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马尔可夫方程的解
- 下一篇: POJ1228(稳定凸包问题)