バッチファイルでProject Euler(10)

Problem 3

長整数の掛け算は4桁ずつにわければ簡単です。しかし割り算は難しいです。ここでは手抜きしています。除数は32ビットの整数を使って、被除数を4桁に分けています。しかし、除数は最大6桁で、余りも最大6桁になるので1万倍したら10桁になってオーバーフローします。
大きさの比較は、同じ4桁ずつの区切りで比較します。

:greater_equal
    if "%1" == "" exit /b 1
    if %1 GTR %2 exit /b 1
    if %1 LSS %2 exit /b 0
    call :greater_equal %3 %4 %5 %6
    exit /b %ERRORLEVEL%

最初の4桁ずつを比較して、同じならシフトして自分を呼び出します。4つしか引数がないから%5はなさそうですが、値がセットされていないだけで使っても問題ないです。4回目が呼び出されたときに%1も値がセットされていないのでそのときは等しいと判定します。

@echo off

set N=600851475143
set n1=%N:~0,-8%
if "%n1%" == "" set /a n1 = 0
set n2=%N:~-8,-4%
if "%n2%" == "" set /a n2 = 0
set /a n3 = %N:~-4%

set /a p = 2
:loop
    call :mod %n1% %n2% %n3% %p%
    if %ERRORLEVEL% NEQ 0 (
        set /a p += 1
        goto :loop
    )
    
    rem // n /= p
    set /a r1 = %n1% %% %p%
    set /a n1 /= %p%
    set /a n2 = %r1% * 10000 + %n2%
    set /a r2 = %n2% %% %p%
    set /a n2 /= %p%
    set /a n3 = (%r2% * 10000 + %n3%) / %p%
    
    rem // q = p * p
    set /a p1 = %p% / 10000
    set /a p2 = %p% %% 10000
    set /a q3 = %p2% * %p2%
    set /a q2 = 2 * %p1% * %p2% + %q3% / 10000
    set /a q3 = %q3% %% 10000
    set /a q1 = %p1% * %p1% + %q2% / 10000
    set /a q2 = %q2% %% 10000
    
    call :greater_equal %n1% %q1% %n2% %q2% %n3% %q3%
    if %ERRORLEVEL% == 1 goto :loop

call :greater_equal %n1% 0 %n2% 0 %n3% 2
if %ERRORLEVEL% == 1 (
    call :echo_long %n1% %n2% %n3%
) else (
    echo %p%
)
exit /b 0

:mod
    setlocal
    set /a d = %4
    set /a r = ((%1 %% %d% * 10000 + %2) %% %d% * 10000 + %3) %% %d%
    exit /b %r%

:greater_equal
    if "%1" == "" exit /b 1
    if %1 GTR %2 exit /b 1
    if %1 LSS %2 exit /b 0
    call :greater_equal %3 %4 %5 %6
    exit /b %ERRORLEVEL%

:echo_long
    setlocal
    set /a n = (%1 * 10000 + %2) * 10000 + %3
    echo %n%