前回のスレッドに関連した質問なので、こちら(↓)を見てくださるとうれしいです。省略してしまいすみません。
http://dixq.net/forum/viewtopic.php?f=3&t=14938
上のスレッドでは、漸化式Xn+1 = (a*Xn+c)modM a=1103515245、c=12345、M=2^31 を用いて乱数を計算していましたが、現在は
M=5^13,a=2^39として Xn=a*Xn(mod M) という漸化式を用いてプログラムを作成しています。
それ以外に以前と違うのは、long long int型では桁が足らず、unsigned long long型を使用しているところです。
プログラムは実行することができたのですが、桁が多く、M回ループをまわすと、とても実行が終わりません。
プログラムを速くする方法はないでしょうか。
詳しい方がおられましたら、ご教示お願いします。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void){
unsigned long long a=pow(5,13);
unsigned long long Xn=1; //初期値
unsigned long long M=pow(2, 39);
unsigned long long n=0;
while(1){
Xn=(a*Xn) % M; //乱数の計算
n++;
if(n % 10000000 == 0)
printf("%lld\t Xn=%lld\n",n,Xn); //10000000ごとに出力
if(Xn==1) break; //1周期終えたら、ループを抜ける
}
// 結果出力
printf("%lld\t Xn=%lld\n",n,Xn);
printf("周期 %lld\n",n);
return EXIT_SUCCESS;
}
Ubuntu / gcc4.7.3
Windows7(cygwin) / gcc3.4.4