• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 97, 文章 - 22, 評(píng)論 - 81, 引用 - 0
            數(shù)據(jù)加載中……

            Pku 3209 From Pythagoras to …(數(shù)論)

            問(wèn)題描述:
            給定一個(gè)數(shù),問(wèn)它是否能夠表示成兩個(gè)整數(shù)的平方和。
            解題思路:
            費(fèi)馬平方和定理的表述是:奇素?cái)?shù)能表示為兩個(gè)平方數(shù)之和的充分必要條件是該素?cái)?shù)被4除余1。
            于是一個(gè)素?cái)?shù)p = 4n+1或者p = 2則必定能表示成兩個(gè)平方數(shù)之和。
            同樣可以推導(dǎo)出如果兩個(gè)數(shù)均能表示成兩個(gè)平方數(shù)之和,則他們的乘積必定能表示成兩個(gè)平方數(shù)之和:
            p = a^2 + b^2;
            q = c^2 + d^2;
            p*q = (a^2 + b^2)(c^2 + d^2) = (ac)^2 + (ad)^2 + (bc)^2 + (bd)^2 = (ac + bd)^2 + (ac - bd)^2
            只要將所求數(shù)分解素因子,然后對(duì)于每個(gè)素?cái)?shù)看是否滿足條件,一旦有一個(gè)素因子不滿足費(fèi)馬平方和定理則直接輸出"NO",全部滿足則輸出"YES"

            代碼如下:

            #include 
            <iostream>
            #include 
            <cstdlib>
            #include 
            <cmath>
            #define gcc 10007
            typedef __int64 Int;
            #define MAX ((Int)1<<63)-1

            using namespace std;

            Int p[
            10= {2357111317192329};

            Int Gcd(Int a, Int b)
            {
                Int m 
            = 1;
                
            while(m)
                
            {
                    m 
            = a % b;
                    a 
            = b;
                    b 
            = m;
                }

                
            return a;
            }


            //計(jì)算a*b%n
            inline Int Produc_Mod(Int a, Int b, Int mod)
            {
                Int sum 
            = 0;
                
            while(b)
                
            {
                    
            if(b & 1) sum = (sum + a) % mod;
                    a 
            = (a + a) % mod;
                    b 
            /= 2;
                }

                
            return sum;
            }


            //計(jì)算a^b%n
            inline Int Power(Int a, Int b, Int mod)
            {
                Int sum 
            = 1;
                
            while(b)
                
            {
                    
            if(b & 1) sum = Produc_Mod(sum, a, mod);
                    a 
            = Produc_Mod(a, a, mod);
                    b 
            /= 2;
                }

                
            return sum;
            }


            //Rabin_Miller判素
            bool Rabin_Miller(Int n)
            {
                
            int i, j, k = 0;
                Int u, m, buf;
                
            //將n-1分解為m*2^k
                if(n == 2)
                    
            return true;
                
            if(n < 2 || !(n & 1))
                    
            return false;
                m 
            = n-1;
                
            while(!(m & 1))
                
            {
                    k
            ++;
                    m 
            /= 2;
                }

                
            for(i = 0; i < 9; i++)
                
            {
                    
            if(p[i] >= n)
                        
            return true;

                    u 
            = Power(p[i], m, n);
                    
            if(u == 1)
                        
            continue;
                    
            for(j = 0; j < k; j++)
                    
            {
                        buf 
            = Produc_Mod(u, u, n);
                        
            //看是否有非平凡因子存在
                        if(buf == 1 && u != 1 && u != n-1)
                            
            return false;
                        u 
            = buf;
                    }

                    
            //如果p[i]^(n-1) % n != 1 那么 n為合數(shù)
                    if(u-1)
                        
            return false;
                }

                
            return true;
            }


            Int Pollard_rho(Int n)
            {
                
            while(1)
                
            {
                    
            int i = 1;
                    Int x 
            = rand() % (n-1+ 1;
                    Int y 
            = x;
                    Int k 
            = 2;
                    Int d;
                    
            do{
                        i
            ++;
                        d 
            = Gcd(n + y - x, n);
                        
            if(d > 1 && d < n)
                            
            return d;
                        
            if(i == k)
                            y 
            = x, k *= 2;
                        x 
            = (Produc_Mod(x, x, n) + n - gcc) % n;
                    }
            while(y != x);
                }

            }


            Int prime[
            10000];
            int top;

            void Prime_Divisor(Int key)
            {
                
            if( Rabin_Miller(key) )
                
            {
                    prime[ top 
            ++ ] = key;
                }
            else
                
            {
                    Int buf 
            = Pollard_rho(key);

                    
            if( Rabin_Miller(buf) ){
                        prime[ top 
            ++ ] = buf;
                    }
            else{
                        Prime_Divisor(buf);
                    }



                    
            if( Rabin_Miller(key / buf) ){
                        prime[ top 
            ++ ] = key / buf;
                    }
            else{
                        Prime_Divisor(key 
            / buf);
                    }

                }

            }

            int main()
            {
                
            int t, i;
                Int n;
                scanf(
            "%d"&t);
                
            while(t--)
                
            {
                    scanf(
            "%I64d"&n);
                    
            if(n < 0)
                        printf(
            "NO\n");
                    
            else if(n == 0 || n == 1)
                        printf(
            "YES\n");
                    
            else 
                    
            {
                        top 
            = 0;
                        Prime_Divisor(n);

                        
            for(i = 0; i < top; i++)
                            
            if( prime[i] != 2 && (prime[i] - 1% 4 )
                                
            break;
                        
            if(i < top)
                            printf(
            "NO\n");
                        
            else
                            printf(
            "YES\n");
                    }

                }

            }

            posted on 2009-02-10 21:04 英雄哪里出來(lái) 閱讀(379) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): ACM

            久久精品免费观看| 久久久一本精品99久久精品66| 久久久国产打桩机| 久久精品中文字幕无码绿巨人| 国内精品久久久久久久亚洲| 久久亚洲高清综合| 亚洲狠狠婷婷综合久久蜜芽| 久久综合狠狠综合久久综合88| 色天使久久综合网天天| 久久青青草原国产精品免费| 精品久久人人爽天天玩人人妻| 久久青青草原亚洲av无码app| 久久精品极品盛宴观看| 国产∨亚洲V天堂无码久久久| 久久精品国产亚洲AV蜜臀色欲 | 日产精品久久久久久久| 韩国三级大全久久网站| 中文字幕无码久久精品青草 | 国产精品成人久久久久三级午夜电影| 亚洲国产日韩欧美久久| 色欲久久久天天天综合网| 久久精品成人免费网站| 欧美久久综合九色综合| 国产精品久久久久天天影视| 婷婷伊人久久大香线蕉AV| 久久久久久毛片免费看| 国产精品久久久久影视不卡| 久久久久亚洲AV成人片| 久久免费看黄a级毛片| 久久天天躁狠狠躁夜夜avapp| 色老头网站久久网| 欧美日韩中文字幕久久久不卡| 久久久久亚洲AV成人网人人网站 | 99精品久久久久久久婷婷| 丁香色欲久久久久久综合网| 午夜精品久久久久久久无码| 久久精品无码av| 欧美亚洲另类久久综合婷婷| 国内精品九九久久精品| 国产精品久久久久久久app| 久久国产视频99电影|