まず、今の自分のレベル、状態について書きます。
[1] 質問文
[1.1] 自分が今行いたい事は何か・・・より速く、大きな数、サンプルなどの数の処理を早くしたいです。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)…コードは記載させてもらいました。
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)・・・エラーはないです。
[1.4] 今何がわからないのか、知りたいのか・・・long型などを試してもより遅くなったりしたので、自作関数を作れば早くなるのかもしれないと感じました。ただ、どうやってこの問題をかみ砕いて関数を作ればいいのか分かりません。知りたいことは、C言語における、高速化の方法です。
[2] 環境
[2.1] OS : Windows vistaです。
[2.2] コンパイラ名 : 学習用C言語開発環境 Ver 0.0.9.0(苦しんで覚えるC言語というサイトで頒布されています。)
[3] その他
・どの程度C言語を理解しているか・・・一通り勉強はしました。ただ、再帰の部分がまだ不完全で、勉強中です。
問題です。
ある計算機学者が電子空間に棲息する電子蝿という奇妙な生命体を見つけました。電子蝿の行動を観察し ているうちに、この空間の (x, y, z)地点にいる電子蝿は、次に以下の規則で示される (x', y', z')に移動すること が分かりました。
x'=a1 x mod(m1)
y'=a2 y mod(m2)
z'=a3 z mod(m3)
ただし、a1, m1, a2, m2, a3, m3は電子蝿の個体ごとに定まる正の整数です。A mod B は正の整数Aを正の整数B で割ったときの余りです。
さらに観察をすると、ある種の電子蝿は(1,1,1)に置いてからしばらくすると、必ず(1,1,1)に戻ってくることがわ かりました。このような蝿を戻り蝿と名付けました1 。戻り蝿のデータを入力とし、(1,1,1)に戻ってくる最小の移動 回数(>0)を出力して終了するプログラムを作成してください。なお 1< a1, m1, a2, m2, a3, m3 < 215とします。
1 a1とm1, a2とm2, a3とm3がそれぞれ互いに素(公約数が 1)である時に戻ります。
Input
複数のデータセットが与えられます。各データセットは以下のとおり:
a1 m1 a2 m2 a3 m3
入力は6つの0を含む行で終わります。
Output
各データセットごとに、(1,1,1)に戻ってくる最小の移動回数(整数)を出力してください。
Sample Input
2 5 3 7 6 13・・・①
517 1024 746 6561 4303 3125・・・②
0 0 0 0 0 0
Output for the Sample Input
12
116640000
自分は次のように書きました。問題文通り、素直に書きました。また、高速化になるかもしれないと思い、いろいろなところで修正、削除しています。
#include<stdio.h>
int main(void)
{
unsigned int a1,m1,a2,m2,a3,m3;
unsigned int x,y,z;
unsigned int m;
while(1)
{
scanf("%d %d %d %d %d %d",&a1,&m1,&a2,&m2,&a3,&m3);
if(a1==0)break;//1< a1, m1, a2, m2, a3, m3 < 215より、1つでも0なら必ず出力は終わります。
x=1;
y=1;
z=1;
m=0;
for(;;)
{
x=a1*x%m1;
y=a2*y%m2;
z=a3*z%m3;
m++;
if(x==1&&y==1&&z==1)break;
}
printf("%d\n",m);
}
return 0;
}
どのようにすれば高速化できるのでしょうか?
皆様のお力を貸していただきたいです。
よろしくお願いします。