• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:位数を求めるプログラム)

位数を求めるプログラム

このQ&Aのポイント
  • a^e≡1(mod n)を満たす最小の正の整数eを法nに関するaの位数です。
  • 位数は31が素数なので30の約数であるはずなのですが11とか12などが出てきてしまいます。
  • 問題のある箇所を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

k の値がどうなっているか調べてみましたか? 合同式の性質をうまく使って, 途中に現れる数値が 大きくなりすぎないようにしましょう.

ebinamori
質問者

お礼

アドバイス有難うございます。 kの値がたまに-になったりしてました。 数が大きくなりすぎているようですね。 余りを使ってやってみます。

ebinamori
質問者

補足

出来ました。有難うございました。 #include <stdio.h> #include <stdlib.h> int main(void) { int h,i,j,k,n; int *ptr; char ch[5]; while(1){ for(i=0;i<1;i++){ printf("1:法nそれぞれの位数を求める\n"); printf("2:終了する。\n"); if(!(n=atoi(gets(ch)))||n<1||n>2){ printf("入力にに誤りがあります\n"); i--; } } if(n==2)break; for(i=0;i<1;i++){ printf("法:"); if(!(n=atoi(gets(ch)))||n<1||n>100){ printf("入力に誤りがあります。\n"); i--; } } ptr=(int *)malloc(n*sizeof(int)); printf("法%2d\n",n); //1の位数は1 printf(" 1:1\n"); for(j=2;j<n;j++){ k=1; for(i=1;i<=(n-1)/2;i++){ //j^iを求める。 k=j*k; for(h=2;h*n<k;h++); //余りが1になるものを位数とする。 k=k%((h-1)*n); if(k==1){ printf("%2d:%2d\t\n",j,i); ptr[j-2]=i; break; } } //i<=(n-1)/2までに余りが1あまるものがなければn-1を位数とする。 if(i>(n-1)/2){ printf("%2d:%2d\n",j,n-1); ptr[j-2]=n-1; } } printf("原始根:"); for(i=0;ptr[i];i++) if(ptr[i]==n-1)printf("[%d] ",i+2); free(ptr); printf("\n"); } return 0; }

関連するQ&A

専門家に質問してみよう