実際にコードを実行せずに、アルゴリズムにかかるおおよその時間を計算する必要があります。
ハードウェアによっては完了するまでに数日または数週間かかるため、実際には完全なアルゴリズムを実行することはできません。本質的に対数のアルゴリズム。以下は、アルゴリズムの推定です。もちろん、ここにはロジックは含まれていません。
[n]
2の累乗から始めます。これ[n]
は大きな数です。
int baseTwo = 2;
double log = 0D;
BigInteger number = 0;
double exponent = 5000000; // 5,000,000.
while (exponent > 0)
{
number = BigInteger.Pow(baseTwo, (int) exponent); // [baseTwo]=2 raised to the power [exponent].
number = this.ProcessNumber(number, baseTwo); // Returned number will be slightly smaller than what went in.
exponent = BigInteger.Log(number, baseTwo); // The Base 2 Log to calculate the slightly decreased exponent (if exponent was 38762, then the result would be 38761.4234 for example).
}
private BigInteger ProcessNumber(BigInteger number)
{
double rand = 0;
BigInteger result = 0;
rand = Random.Next(51, 100) / 100D; // Anywhere between 51% to 99%.
result = number * rand; // [result] will always be less than [number] but more than half of [number].
return (result);
}
指数はゼロに向かって反復しているため、反復ごとの時間は反復ごとに自然に減少します。
- マシンでの最初と最後の反復の実行時間を考慮して、合計時間を計算する方法はありますか?
- そうでない場合は、[指数] に 5,000,000、4,500,000、4,000,000 などの個別の範囲を取り、そこから計算できますか?