有限体GF(4)上の同次方程式で不定方程式
連立方程式の解法ですが、手計算だとうまくいくのにプログラムにしようとするとうまくいきません。
さらに不定方程式なので解がないといわれてしまいます。誰かわかる方がいらしたらプログラムを
見て直していただきたいです。プログラムは以下の通り。
#define N 4
#define T 6
unsigned char gf[4]={0,1,2,3},fg[4]={0,1,2,3};
unsigned char gf[4]={0,1,2,3},fg[4]={0,1,2,3};
unsigned char ad[4][4];
/* 答えは 1,1,2 */
unsigned char s[3][3]={{1,3,1},{3,3,0},{1,0,3}};
/* 答えはzを不定として1と置き、x=z=1;y=0;になる筈だがならない */
//unsigned char s[][]={{2,2,2},{2,0,2},{2,2,2}}
int add(int x,int y){
return ad[x][y];
}
int mlt(int x, int y){
if(x==0||y==0)
return 0;
return ((x+y-2)%(N-1))+1;
}
int mltn(int n,int x){
int i,j;
if(n==0)
return 1;
i=x;
for(j=0;j<n-1;j++)
i=mlt(i,x);
return i;
}
int div(int x,int y){
if(x==0)
return 0;
return ((x-y+(N-1))%(N-1))+1;
}
void syn(){
int i,j,k,l,n;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(i==j){
if(s[i][j]==1){
for(l=0;l<3;l++){
for(k=0;k<3;k++){
s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k]));
printf("%d ",s[l][k]);
}
printf("\n");
}
}
// exit(1);
if(s[i][j]!=1){
printf("%da \n",s[i][j]);
n=div(1,s[i][j]);
if(n==0){
printf("%d =\n",fg[s[i][j]]);
exit(1);
}
for(k=0;k<3;k++){
if(s[0][0]==0){printf("%d?\n",s[0][0]); exit(1);}
s[i][k]=mlt(n,s[i][k]);
printf("%d ",s[i][k]);
}
printf("\n");
for(l=i;l<3;l++){
for(k=0;k<3;k++){
s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k]));
// printf("%d ",s[l][k]);
}
printf("\n");
}
printf("\n");
for(l=0;l<3;l++){
for(k=0;k<3;k++)
printf("%d ",s[l][k]);
printf("\n");
}
// exit(1);
if(s[i][j]==0){
while(s[i][j]==0){
j++;
}
printf("i-j==%d\n",s[i+1][j]);
if(s[i][j]!=0){
if(s[i][j]==1){
for(l=0;l<3;l++){
for(k=0;k<3;k++){
s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k]));
printf("%d ",s[l][k]);
}
printf("\n");
}
}
// exit(1);
if(s[i][j]!=1){
printf("%da \n",s[i][j]);
n=div(1,s[i][j]);
if(n==0){
printf("%d =\n",fg[s[i][j]]);
exit(1);
}
for(k=0;k<3;k++){
if(s[0][0]==0){printf("%d?\n",s[0][0]); exit(1);}
s[i][k]=mlt(n,s[i][k]);
printf("%d ",s[i][k]);
}
printf("\n");
for(l=i;l<3;l++){
for(k=0;k<3;k++){
s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k]));
// printf("%d ",s[l][k]);
}
printf("\n");
}
printf("\n");
for(l=0;l<3;l++){
for(k=0;k<3;k++)
printf("%d ",s[l][k]);
printf("\n");
}
}}
// i++;j++;
//exit(1);
}
}
}
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%2d ",s[i][j]);
printf("\n");
}
}
int main(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++)
ad[i][j]=fg[gf[i]^gf[j]];
}
syn();
}
お礼
やはりpで割っていたために無限大となっていました。 ありがとうございます。