出力をunsigned int
配列に格納する必要があります。ただし、出力は、モジュロ2147483647、つまりモジュロ2^31-1 の配列内の前の要素の線形結合の解です。
以下は、より大きな関数のコード スニペットです。すぐに、このスニペットはii
のインデックスをラップするため、間違った回答を生成しますxx
。(xx
配列内の要素が空にならないように、関数が呼び出される前にシードされることに注意してください。)
#include <stdint.h>
typedef unsigned int uint32;
typedef unit_least64_t uint64;
static uint32 xx[47];
...
xx[ii] = 12345 * (uint64)(xx[i0] + xx[ii]) % 2147483647; // i0, ii are defined elsewhere
ただし、最後の行を次の行と入れ替えると、継続的に正しい解が得られます。
xx[ii] = 12345 * ( (uint64)xx[i0] + (uint64)xx[ii] ) % 2147483647;
おそらく明らかですが、unit64 に対して 1 回ではなく 2 回の型キャストを行う必要があるのはなぜでしょうか。