質問: 任意の値からループするカウンタ間の値が被らないことを確認したいのですが、その条件を出しかねています。 数学的にアプローチできると良いのですが、ネタも知識も不足しており、どのようにアプローチすれば良いのかも判断ついておりません。 どのように考えれば良いのかヒントとなる何かでも良いのでご教示いただけたら幸いです。 --- 255までの数値を1~10個格納できる配列がある。格納した個数を格納数とする。 格納数分だけカウンタを用意する。 1回目の処理で各カウンタは1から順に値を与えられて初期化される。 このカウンタは、処理のタイミングでデクリメントされていき0になったら、対応する配列に格納された値に戻す。 この処理を延々繰り返しても、カウンタ間の値が被らないことを、配列に格納した数値から確認したいのですが... 配列に格納した数値、格納数、数値が格納された位置によっても被る、被らないが変化してしまうため、値から論理的に判断する術が見つかっていません。 何か判断する方法はないでしょうか? e.g.)[6,8] 格納数2:被らない格納パターン ![画像の説明をここに入力](https://i.stack.imgur.com/WocXC.png) e.g.)[6,6,8] 格納数3:被る格納パターン ![画像の説明をここに入力](https://i.stack.imgur.com/ACyzc.png) --- 設定される値の条件として、以下のような条件であれば、10件設定されていてもカウンタが被る値になることはありません。 ・格納数以上の値を設定 ・格納される値は、最小値の倍数を設定 しかし、これはゆるい条件です。 件数が少なかったり、格納位置(index)によっても影響があるため、説明しきれていません。
回答: インデックスiの値を配列の要素をAi、 処理回数をtとしたときの、カウンターの値をCtiとすると、 `Cti == Ctj`であるとき、あるxについて`Cxi == Cxj == 1`が成り立ちます。 この時、 ``` x == C0i (mod Ai) x == C0j (mod Aj) ``` となり、このようなxが存在するかどうかは、いわゆる中国の剰余定理(と少し応用)で求めることができます。 具体的にはAi, Ajの最大公約数をGとしたとき、`C0i - C0j == 0 (mod G)`が成り立つときにかぶりが発生し、そうでないとき発生しません。