日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU2650(高斯整数环)

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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


?

#include <iostream> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <math.h>using namespace std; const int N=100005;int prime[N], p[N],k; int pri[N],top; int n;struct point {int a;int b;char oper; }s[N];int num; //篩選素數void isprime() {k=0;int i,j;memset(prime,true,sizeof(prime));for(i=2;i<N;i++){if(prime[i]){p[k++]=i;for(j=i+i;j<N;j+=i){prime[j]=false;}}} }//素因子分解 void Divide(int n) {int i;top=0;for(i=0; i<k; i++){if(n%p[i]==0){pri[top++]=p[i];n/=p[i];while(n%p[i]==0){pri[top++]=p[i];n/=p[i];}}}if(n>1)pri[top++]=n; }//高斯素數分解 void Part(int prime) {int i;if(prime==2){s[num].a = 1;s[num].b = 1;s[num++].oper = '+';s[num].a = 1;s[num].b = 1;s[num++].oper = '-';}else if((prime - 1)%4==0){for(i=1;;i++){int u=int(sqrt(prime-i*i*1.0)+1e-5);if(u*u+i*i==prime){s[num].a = i;s[num].b = u;s[num++].oper='+';s[num].a = i;s[num].b = u;s[num++].oper='-';break;}}}else{s[num].a=prime;s[num++].b=0;} }int cmp(const void *a, const void *b) {point *c = (point *)a;point *d = (point *)b;if(c->a != d->a)return c->a - d->a;if(c->b != d->b)return c->b - d->b;return c->oper == '-' ? 1 : -1; }void Print(int key) {printf("%d", s[key].a );if(s[key].b == 0)return;if(s[key].b == 1)printf("%cj", s[key].oper);elseprintf("%c%dj", s[key].oper, s[key].b); }int main() {isprime();int i, cas=1;while(~scanf("%d", &n)){num = 0;Divide(n);for(i=0;i<top;i++)Part(pri[i]);qsort(s, num, sizeof(point), cmp);printf("Case #%d: ", cas++);Print(0);for(i=1; i<num; i++){if(s[i].a==s[i-1].a&&s[i].b==s[i-1].b&&s[i].oper==s[i-1].oper)continue;if(i)printf(", ");Print(i);}puts("");}return 0; }


?

總結

以上是生活随笔為你收集整理的HDU2650(高斯整数环)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。