コラッツ・角谷の問題
Posted feedbacks - Batchfile
バッチで書いてみました。
速度に難があるため、1 ~ 2^12までの範囲でしか確認できていませんが、一応投稿します。
実行時間の計測には「実行時間の測定」で投稿したものを使用しています。
e.g.
実行環境 : Pentium M (1.6GHz), 768MB RAM
実行結果 : f(3711) = 237
実行時間 : 450050 (ms)
最初は以下のようにcallを使用して再帰的に書いていたのですが、速度を考慮してgotoを
利用したループに書き換えました。
e.g.
:collatz
if %1 leq 1 goto :EOF
set /a m=%1%%2
if %m% equ 0 (set /a n=%1/2) else (set /a n=3*%1+1)
call :collatz %n%
goto :EOF
ただそれでも2^20まで実行した場合 1日では終わらないので、全く異なるロジックを編み
出す以外、手詰まりとなってしまいました。
# おそらく、遅延環境変数展開を利用して書き換えたくらいでは焼け石に水でしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @echo off
setlocal
set s_=0
set i_=0
set /a "i=1<<12"
for /l %%i in (1,1,%i%) do call :collatz %%i
echo f(%i_%) = %s_%
endlocal
goto :EOF
:collatz
set n=%1
set s=0
:loop
if %n% leq 1 goto compare
set /a m=%n%%%2
if %m% equ 0 (set /a n/=2) else (set /a n=3*%n%+1)
set /a s+=1
goto loop
:compare
if %s% leq %s_% goto :EOF
set s_=%s%
set i_=%1
goto :EOF
|



ところてん
#4969()
Rating2/2=1.00
see: コラッツの問題の成り立つ範囲
[ reply ]