線形合同法を用い、初期値を1として、次に1が出てきたらループを終え、周期を出力したいです。
(漸化式Xn+1 = (a*Xn+c)modM a=1103515245、c=12345、M=2^31 を用います)
プログラムを作成し、実行してみたのですが、ループが最大周期であるはずのMを超えても止まりません。
どこを直せばよいかわからず困っています。
詳しい方がおられましたら、ご教示お願いいたします。
以下に、ソースコード、処理の説明、実行環境を示します。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void){
double a=1103515245;
double c=12345;
double Xn=1; //初期値
double M=1;
double n=0;
int i;
//最大周期 2^31 を求める
for(i=31;i>0;i--)
{
M=M*2;
}
while(1){
Xn=fmod(a*Xn+c,M); //乱数の計算
n++;
if(fmod(n,10000000)==0)
printf("%.0lf\t Xn=%10.0f\n",n,Xn); //10000000ごとに出力
if(Xn==1) break; //1周期終えたら、ループを抜ける
}
// 結果出力
printf("%.0lf\t Xn=%10.0f\n",n,Xn);
printf("周期 %.0f\n",n);
return EXIT_SUCCESS;
}
OS Windows7
コンパイラ gcc3.4.4