有限体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();
}
お礼
回答ありがとうございました。 問題が解決したので報告します。 構造体を定義するときに、その構造体のサイズは読み込むファイルのデータに依っていました。その後ファイルを読み込んで、質問したように書き出そうとしていました。つまりメモリの大きさを定義出来ていなかったため、問題が生じたようです。 まず読み込むファイルのデータから大きさを求め、次に構造体を定義した所、無事解決しました。 この質問を目にとめて下さった方、ありがとうございましたm(_ _)m。
補足
ごめんなさい。質問するときにしたタイポです。 でもプログラム自体の問題は解決されてないので、引き続きアドバイスがあったらよろしくお願いします。