此帖的由来
http://www.cn-dos.net/forum/viewthread.php?tid=27044
-----------------------------------------------------------------------------------------------
以下代码完全照搬了以下链接中的判定算法——米勒拉宾检验+二次检验
http://blog.csdn.net/bsrw/archive/2006/11/28/1419145.aspx
-----------------------------------------------------------------------------------------------
遗憾的是其中的二次检测会导致大素数判定时数据溢出
测试结果从46400开始大量出现因为数据溢出而导致的漏检
1000以内测试没有漏检
1000~46400 没有测试
[ Last edited by qzwqzw on 2007-1-28 at 11:34 AM ]
http://www.cn-dos.net/forum/viewthread.php?tid=27044
-----------------------------------------------------------------------------------------------
以下代码完全照搬了以下链接中的判定算法——米勒拉宾检验+二次检验
http://blog.csdn.net/bsrw/archive/2006/11/28/1419145.aspx
-----------------------------------------------------------------------------------------------
遗憾的是其中的二次检测会导致大素数判定时数据溢出
测试结果从46400开始大量出现因为数据溢出而导致的漏检
1000以内测试没有漏检
1000~46400 没有测试
@echo off
setlocal EnableDelayedExpansion
set time0=%time%
for /l %%i in (46001,2,48000) do (
set /a testnum=%%i
call :JudgePrime !testnum!
if !errorlevel! equ 1 set /p=!testnum! <nul & set /a iprime+=1
)
echo.
echo.
echo begin: %time0%
echo finish: %time%
echo found: %iprime%
pause
goto :eof
:JudgePrime
if == exit /b 2
set /a tmp1=%1
if not %tmp1%==%1 exit /b 2
if %1 lss 2 exit /b 0
if %1 equ 2 exit /b 1
set i=0
for %%i in (2,3,5,7,11) do (
set prime_!i!=%%i
set /a prime6p_!i!=%%i*%%i*%%i
set /a prime6p_!i!*=prime6p_!i!
set /a i+=1
)
set i=0
:loop1_JP
call set prime_i=%%prime_%i%%%
call set prime6p_i=%%prime6p_%i%%%
if %1 geq %prime6p_3% (
if !prime_i! equ 3 (
set /a i+=1
goto :loop1_JP
)
) else (
if !prime_i! neq 2 if %1 lss !prime6p_i! exit /b 1
)
call :LikePrime %1 %prime_i%
if not errorlevel 1 exit /b 0
set /a i+=1
if %i% lss 5 goto :loop1_JP
exit /b 1
goto :eof
:LikePrime
set /a x=result=1, tmp1=%1-1, bits=0
:loop1_LP
set /a bits+=1
set /a "tmp1>>=1"
if %tmp1% gtr 0 goto :loop1_LP
set /a tmp1=%1-1
:loop2_LP
set /a bits-=1
set /a result=(x*x) %% %1 %=此句代码判断导致大素数时数据溢出=%
if %result% equ 1 if %x% neq 1 if %x% neq %tmp1% exit /b 0
set /a "tmp2=%tmp1% & (1 << %bits%)"
if %tmp2% neq 0 set /a result=(result*%2) %% %1
set x=%result%
if %bits% gtr 0 goto :loop2_LP
if %result% equ 1 exit /b 1
goto :eof
[ Last edited by qzwqzw on 2007-1-28 at 11:34 AM ]
