質多項式

給定多項式f(x)anxnan-1xn-1+…+a0x0,如果an<>0,我們稱f(x)是一個n次多項式。

類似自然數裏的“質數”的概念,也可以給出“質多項式”的概念。給定多項式f(x),如果找不到次數至少爲1的多項式g(x)h(x)滿足f(x)=g(x)h(x),我們稱f(x)是質多項式。

爲了簡化起見,我們規定多項式各項的係數只能取兩個數:01。並且重新定義在{01}上的加法和乘法:

000011101110

0×000×101×000×00

下面給出多項式相乘的例子:

(x2x1)×(x11)=x3x2x2x1x3x1

                                                                                                                      .

在這個問題裏,你需要寫一個程序,對給定的正整數k,求出次數爲k的質多項式的。

Simple input

Output for the input

1

2

5

13

0

 

X

X^2+X+1

X^5+X^2+1

X^13+X^4+X^3+X^1+1

 

解:

觀察題目可知這裏的的加法運算XOR,其逆運算減法運算也是異或運算XOR

乘法運算是與運算AND

於是解題時可以按照窮舉法逐個遍歷,直到找到解爲止。

還有一點需要注意的是K次質多項式必含有X^K1項。

 

代碼:

 

 

 
#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>


int bin[31];

inline 
void
init(){
    
int i;
    bin[
0]=1;
    
for(i=1;i<=30;i++)
        bin[i]
=bin[i-1]*2;    //bin[i]=2^i
}

inline 
int 
weight(
int data){    //返回data中第一個非零位的位置
    int i=30;
    
for(;i>=0;i--)
        
if(bin[i]<=data) return i;
}

inline 
void
output(
int data){
    
int i;
    
for(i=30;i>0;i--){
        
if(data&bin[i]) printf("x^%d+",i);
    }
    printf(
"1 ");
}

inline 
bool
divide(
int a,int b){    //判斷b能否整除a
    int wa,wb;
    wa
=weight(a);
    wb
=weight(b);
    b
=b<<(wa-wb);
    
while(a!=&& wa>=wb){
        a
=a^b;    //a=a xor b
        while(bin[wa]>a){
            
--wa;
            b
=b>>1;
        }
    }
    
return wa>=wb? true:false;
}



void 
main(){
    init();
    
int k,flag,i,now;
    
while(1){
        scanf(
"%d",&k);
        
if(k==0return;
        now
=bin[k]-1;
        
do{
            
if(now>bin[k+1]) {puts("error");break;}
            flag
=false;
            now
+=2;
            
for(i=2;i<bin[(k+1)/2+1]-1;i++){
                
if(divide(now,i)==true) {
                    flag
=true;
                    
break;
                }
            }
        }
while(flag);
        output(now);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章