[Batch] Algoritmo de Numeros Primos

Iniciado por SmartGenius, 16 Noviembre 2008, 00:53 AM

0 Miembros y 1 Visitante están viendo este tema.

SmartGenius

Codigos para trabajar con numeros primos, usndo las matematicas euclidianas, estos codes son utiles para saber cuando un numero es primo, el n-esimo termino de la sucesion de primos, el primo mas cercano de un numero y los mas importantes que son la descomposicion de cualquier numero en sus factores primos y la simplificacion de expresiones...

Empecemos pues:

Citar1.   Implemente el método "call:EsPrimo valor" que devuelve true o false en dependiendo de si el valor de la variable a es un número primo o no. Intente hacerlo de la manera más eficiente posible.

@echo off
REM Comprueba si un Numero es Primo
REM Coded by :: SmartGenius ::
color 0a
if ["%1"]==[""] goto :error

:ini
set num=%1
set /a c=%num%*1
if not %c%==%num% goto :error
call :cprimo %num%
echo %primo%
goto :eof

:cprimo
set primo=True
set /a lim=%1-1
for /l %%a in (2,1,%lim%) do (call :cprimo2 %%a)
goto:eof
:cprimo2
set /a p=(%num%)%%(%1)
if %p%==0 set primo=False
goto :eof

:error
echo No ha introducido un Valor Numerico
echo.
pause
exit


Citar2.   Implemente el método "call:PrimoMasCercano valor" Este método debe devolver el número primo más cercano al valor.

@echo off
color 0a
REM Busca el Numero Primo mas cercano al Valor N
REM Coded by :: SmartGenius ::
if ["%1"]==[""] goto :error
:init
set n=%1
set /a c=%n%*1
if not %c%==%n% goto :error
call :near %n%
echo %near%
goto :eof

:near
set lim=%1
for /l %%b in (1,1,%lim%) do (
for /f %%c in ('call EsPrimo %%b') do (
if %%c==True set near=%%b
))
goto :eof

:error
echo No ha introducido un Valor Numerico
echo.
pause
exit


Citar3.   Implemente el método "call:TérminoPrimo valor" Este método debe devolver el n-ésimo término de la sucesión de números primos.

@echo off
color 0a
REM Busca El N-esimo valor de la Sucesion de Numeros Primos
REM Coded by :: SmartGenius ::
if ["%1"]==[""] goto :error
:init
set t=%1
set /a c=%t%*1
if not %c%==%t% goto :error
call :ter %t%
echo %ene%
goto :eof

:ter
set lim=%1
set l=1
for /l %%b in (1,1,9999) do (
for /f %%c in ('call EsPrimo %%b') do (
if defined ene goto :eof &goto :eof
if %%c==True call :val %%b
))
goto :eof

:val
if %l%==%lim% set ene=%1
set /a l=%l%+1
goto :eof

:error
echo No ha introducido un Valor Numerico
echo.
pause
exit


Citar4.   Implemente el método "call:DescomposiciónPrimos valor" Este método debe escribir en la consola la descomposición en números primos del valor.

@echo off
color 0a
REM Descomposicion en Factores Primos
REM Coded by :: SmartGenius ::
if ["%1"]==[""] goto :error
setlocal
:ini
set op=
set num=%1
set /a c=%num%*1
if not %c%==%num% goto :error
call :func1 %num%
:fin
echo %op:~1%
endlocal
goto :eof

:func1
set lim=%1
for /f %%z in ('call EsPrimo %lim%') do (if %%z==True set op=*1*%lim% & goto :eof)
for /l %%n in (2,1,%lim%) do (
for /f %%c in ('call EsPrimo %%n') do (
if %%c==True call :func2 %lim% %%n
))
goto :eof

:func2
set val=%1
:func3
set var=%op%
set /a c=%var:~1%
if %c% GEQ %lim% goto :eof
set /a mod=(%val%)%%(%2)
if %mod%==0 set op=%op%*%2& set /a val=(%val%)/(%2)&goto :func3
goto :eof

:error
echo No ha introducido un Valor Numerico
echo.
pause
exit


Citar5.     Implemente el metodo "call:PowerPrimos cadena" Teniendo una cadena como "2*2*3*3*23" que es la descomposicion de "828" en numeros primos  devolver una cadena que eleve los valores que se repiten. Para este caso el metodo debe devolver "2^2*3^2*23".

@echo off
color 0a
REM Simplificacion de Cadenas
REM Coded by :: SmartGenius ::
setlocal enabledelayedexpansion
if ["%1"]==[""] goto :error
:init
set cadena=%1
call :string %cadena%
:func
for /l %%f in (1,1,%l%) do (call :func2 %%f)
for /l %%g in (1,1,%l%) do (call :func3 %%g)
goto :next
:func2
set lim=%1
for /f "tokens=%lim% delims=*" %%k in ("%cadena%") do (call :add %%k)
goto :eof
:func3
set lim=%1
for /f "tokens=%lim% delims=*" %%j in ("%cadena%") do (call :var %%j)
goto:eof
:next
set oper=%oper:l1=%
set oper=%oper:l=^^^^%
echo %oper:~1%
goto :eof

:var
set t1=%1
if not defined t%t1% call :var2 %t1%
goto:eof
:var2
call set var=!p%1!l!n%1!
set t%1=%1
set oper=%oper%*%var%
goto :eof

:add
set /a n%1+=1
set p%1=%1
goto:eof

:string
set texto=%1
:string2
if not "%texto:~0,1%"=="" (set /a l=%l%+1)
set texto=%texto:~1%
if "%texto%"=="" goto :eof
goto :string2


Todos estos codigos los podemos usar desde la consola...


o desde un codigo principal

@echo off
mode con cols=40 lines=20
title Algoritmo de Numeros Primos
color 0a
REM Calculo de Funciones y Algoritmos con Numeros Primos
REM Matematicas Euclidianas
REM Coded by :: SmartGenius ::

:main
set opc=
cls
echo.
echo   Bienvenido al Programa
echo.
echo  Escoja un Opcion      [X] Salir
echo.
echo 1. Comprobar si un Numero es Primo
echo 2. Primo mas cercano de un Numero (N)
echo 3. Obtener el N-esimo termino Primo
echo 4. Descomponer un Numero
echo 5. Mostrar Descomposicion Recursiva
echo.
set /p opc="Opcion >> "
if not defined opc goto main
if /i %opc%==x exit
if %opc%==5 call :func5
if %opc% GTR 5 goto main
set /p number="Introduzca el Dato : "
if not defined number goto main
set /a b=%number%*1
if not %b%==%number% goto :error
if %opc%==1 call :func1 %number%
if %opc%==2 call :func2 %number%
if %opc%==3 call :func3 %number%
if %opc%==4 call :func4 %number%
pause
goto :main

:func1
set esprimo=NO
set valor=%1
for /f %%c in ('call EsPrimo %valor%') do (
if %%c==True set esprimo=SI
)
echo ^> %valor% %esprimo% es un Numero Primo
pause
goto :main

:func2
set valor=%1
for /f %%d in ('call PrimoMasCercano %valor%') do (set next=%%d)
echo ^> Primo mas cercano de %valor% es %next%
pause
goto :main

:func3
set valor=%1
for /f %%e in ('call TerminoPrimo %valor%') do (set termino=%%e)
echo El %valor% Numero de la Sucesion de
echo Numeros Primos corresponde a %termino%
pause
goto :main

:func4
set nmb=%1
for /f %%u in ('call DescomposicionPrimos %nmb%') do (set desc=%%u)
echo Descomposicion de %nmb% = %desc%
pause
goto :main

:func5
set /p txt="Introduzca la cadena > "
if not defined txt goto :func5
call PowerPrimos %txt%
pause
goto :main

:error
echo No ha introducido un Valor Numerico
pause
goto :main


Espero le sea de gran utilidad... :xD

Saludos.


SmartGenius

Reacomode el codigo y lo parametrice, ahora se puede trabajar totalmente desde Consola.

@echo off
REM Funcion de Numeros Primos
REM Coded by :: SmartGenius ::
setlocal enabledelayedexpansion
if ["%1"]==[""] goto :syntaxis
if ["%2"]==[""] goto :syntaxis
set num=%2
set /a c=%num:~0,1%*1
if not %c%==%num:~0,1% (echo Parametro Numerico Invalido &goto :syntaxis)
if ["%1"]==["/c"] call :cprimo %2
if ["%1"]==["/n"] call :nprimo %2
if ["%1"]==["/t"] call :tprimo %2
if ["%1"]==["/d"] call :dprimos %2
if ["%1"]==["/p"] call :pprimos %2
if ["%1"]==["/h"] call :syntaxis
if ["%1"]==["/?"] call :syntaxis
endlocal
goto :eof

::Numero Primo
:cprimo
set primo=True
set /a lim=%1-1
for /l %%a in (2,1,%lim%) do (
set /a p=%1%%%%%a
if !p!==0 set primo=False)
echo %primo%
goto :eof

::Primo mas Cercano de un Numero
:nprimo
set lim2=%1
for /l %%b in (1,1,%lim2%) do (
call :cprimo %%b >nul
if !primo!==True set near=%%b)
echo %near%
goto:eof

::N-esimo Termino de la Sucesion de Numeros Primos
:tprimo
set lim3=%1
set l=1
set cont=1
:tprimo2
call :cprimo %cont% >nul
if !primo!==True call :tprimo3 %cont%
if defined tprimo echo %tprimo% &goto :eof
set /a cont=%cont%+1
goto :tprimo2
:tprimo3
if %l%==%lim3% set tprimo=%1
set /a l=%l%+1
goto :eof

::Descomposicion de un Numero en Factores Primos
:dprimos
set lim4=%1
call :cprimo %lim4% >nul
if !primo!==True (echo 1*%lim4% &goto :eof)
for /l %%n in (2,1,%lim4%) do (
call :cprimo %%n >nul
if !primo!==True call :dprimos2 %lim4% %%n
)
echo %op:~1%
goto :eof
:dprimos2
set val=%1
:dprimos3
set var=%op%
set /a c=%var:~1%
if %c% GEQ %lim4% goto :eof
set /a mod=(%val%)%%(%2)
if %mod%==0 set op=%op%*%2& set /a val=(%val%)/(%2)&goto :dprimos3
goto :eof

::Simplificacion de Cadenas
:pprimos
set cadena=%1
call :string %cadena%
:func
for /l %%f in (1,1,%len%) do (call :func2 %%f)
for /l %%g in (1,1,%len%) do (call :func3 %%g)
set oper=%oper:l1=%
set oper=%oper:l=^^^^%
echo %oper:~1%
goto :eof
:func2
set lim5=%1
for /f "tokens=%lim5% delims=*" %%k in ("%cadena%") do (call :add %%k)
goto :eof
:func3
set lim6=%1
for /f "tokens=%lim6% delims=*" %%j in ("%cadena%") do (call :var %%j)
goto:eof

:var
set t1=%1
if not defined t%t1% call :var2 %t1%
goto:eof
:var2
call set var=!p%1!l!n%1!
set t%1=%1
set oper=%oper%*%var%
goto :eof

:add
set /a n%1+=1
set p%1=%1
goto:eof

:string
set texto=%1
set len=0
:string2
if not "%texto:~0,1%"=="" (set /a len=%len%+1)
set texto=%texto:~1%
if "%texto%"=="" goto :eof
goto :string2

:syntaxis
echo.      -------------------------------
echo      ^|  Funciones de Numeros Primos  ^|
echo      ^|  Coded by :: SmartGenius ::   ^|
echo       -------------------------------
echo Modo de Uso
echo.
echo %~n0 [Modificadores] Numero^|Operacion
echo Ej: %~n0 /c Variable Numerica
echo.
echo Modificadores:
echo  /c Comprueba si el Numero Introducido es Primo
echo     devolviendo un valor de True o False
echo  /n Imprime en Pantalla el Primo mas Cercano del
echo     Numero introducido.
echo  /t Imprime en Pantalla el N-esimo Termino de la
echo     Sucesion de Numeros Primos.
echo  /d Descompone un Numero en sus Factores Primos.
echo  /p Simplifica una Cadena de Operaciones
echo      Ej: 2*2*2*3*3*5 --^> 2^^3*3^^2*5
echo.
echo. /h^| /? Muestra esta ayuda.
goto :eof


Aun asi le hace falta hacerle una optimizacion....si alguno quiere trabajarle...pues bienvenido sea  ::)

Saludos.