【转帖3】批处理寻找大素数-32位正整数的素性判定
- @echo off
- setlocal EnableDelayedExpansion
-
- :loop_test
- set testnum=
- set /p testnum=请输入一个整数(按i使用内置测试集,直接按回车退出):
- if "%testnum%"=="" goto :eof
- if /i not "%testnum%"=="i" (
- call :JudgePrime %testnum%
- if errorlevel 2 (echo 无效输入:%testnum%
- ) else if errorlevel 1 (echo %testnum% 是素数
- ) else (echo %testnum% 是合数)
- goto :loop_test
- )
-
- 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 found: %iprime%
- echo begin: %time0%
- echo finish: %time%
- pause
- goto :eof
-
- :JudgePrime
- if [%1]==[] 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
复制代码 原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=27198 |