因数分解する数 n を、適当な整数 m と d 次の多項式 f(x) を使って
ここで選ばれる多項式の性質によって後の計算の効率が変わってきますので、効率の良い(=後の計算が速い)数式をうまく選び出す事も重要になります。
ちなみにここで使われている変数(n, m, f(x), d, ci)は他の項目でも同じ意味で使います。
tmp = n;
m = rand();
for( i = d ; i > 0 ; i-- ) {
c[i] = rand();
tmp = tmp - c[i] * (m ** i);
}
c[0] = tmp;
tmp = n; m = rand(n ** (1/(d + 1)), n ** (1/d)); // n**(1/d+1)とn*(1/d)の間の乱数 for( i = 0 ; i ≤ d ; i++ ) { c[i] = tmp % m; tmp = tmp / m; // 後で挿入するところ }大雑把に言うと係数の絶対値が小さい方がいい(どこかの係数が特に優先されるということはない)ので、係数の最大を m にします。係数に負の数を許すと、下記のような改造で最大値を m/2 に収めることができます。
if(c[i] > m / 2 ) {
c[i] = c[i] - m;
tmp = tmp + 1;
}
改造は簡単。これを先ほどのコードのコメント部分に挿入するだけ…と思ったら乱数の範囲をちょいと変えなきゃいけないかも。
int score( int c[] )
{
scr = 0;
for( i = 0 ; i ≤ d ; i++ )
scr += abs( c[i] );
return scr; // 勿論 scr は小さい方が良い
}