'------------------------------------------------------------------------------
' BigNum (18/Sep/06)
' Estructura para trabajar con números enteros de alta precisión.
'
' La DLL BigNum_ltm.dll debe estar en el mismo directorio o en el PATH.
'
' Estructura para usar la DLL BigNum_ltm.dll
'
' Revisado y sobrecarga de operadores (12/Oct/07)
'
' ©Guillermo 'guille' Som, 2006-2007
'
' Para usar esta estructura
' Dim a As BigNum
' a = BigNum.Parse("...")
'------------------------------------------------------------------------------
Option Explicit On
Option Strict On
Imports System
Imports Microsoft.VisualBasic
''' <summary>
''' Estructura para manejar números enteros de gran precisión
''' usando las librerías BigNum_ltm.dll y LibTomMath.lib.
''' Esta estructura usa el tipo mp_int de la librería original
''' que en el wrapper he llamado BigNum.
''' Esta estructura es el tipo usado en las otras estructuras
''' de esta librería.
''' El espacio de nombres usado para esta librería es:
''' elGuille.Developer.LibTomMath
''' </summary>
''' <remarks>
''' Iniciado: 18/Sep/2006
''' Revisado: 22/Oct/2007
''' </remarks>
Public Structure BigNum
Public used As Integer
Public alloc As Integer
Public sign As Integer
Public dp As Integer
'
'
'--------------------------------------------------------------------------
' Métodos compartidos (incluidos los accesos a la librería de C++)
'--------------------------------------------------------------------------
'
' Las funciones del API de LibTomMath
'
Public Declare Function BigNumToString Lib "BigNum_ltm.dll" (ByVal n As BigNum) As String
Public Declare Function BigNumFromString Lib "BigNum_ltm.dll" (ByVal s As String) As BigNum
Public Declare Function BigNumFromInt Lib "BigNum_ltm.dll" (ByVal i As Integer) As BigNum
Public Declare Function BigNumToUInt Lib "BigNum_ltm.dll" (ByVal n As BigNum) As Integer
'
Public Declare Sub BigNumInit Lib "BigNum_ltm.dll" (ByRef n As BigNum)
'
Public Declare Function BigNumMul Lib "BigNum_ltm.dll" Alias "BigNumMul" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumDiv Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum, ByRef n3 As BigNum) As BigNum
Public Declare Function BigNumAdd Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumSub Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumModPow2 Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal pot As Integer) As BigNum
Public Declare Function BigNumAddMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum, ByVal n3 As BigNum) As BigNum
Public Declare Function BigNumSubMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum, ByVal n3 As BigNum) As BigNum
Public Declare Function BigNumMulMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum, ByVal n3 As BigNum) As BigNum
Public Declare Function BigNumSqrMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumInvMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumPowMod Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum, ByVal n3 As BigNum) As BigNum
Public Declare Function BigNumSqrt Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As BigNum
Public Declare Function BigNumSqr Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As BigNum
Public Declare Function BigNumIsSquare Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As Integer
Public Declare Function BigNumJacobi Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As Integer
Public Declare Function BigNumPow Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumPow2 Lib "BigNum_ltm.dll" _
(ByVal pot As Integer) As BigNum
Public Declare Function BigNumGCD Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumLCM Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
' Esta es en realidad la misma que BigNumGCD
' (pero en castellano: Máximo Común Divisor)
Public Declare Function BigNumMCD Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
' Esta es en realidad la misma que BigNumLCM
' (pero en castellano: Mínimo Común Múltiplo)
Public Declare Function BigNumMCM Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Public Declare Function BigNumExtEuclid Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum, _
ByVal U1 As BigNum, ByVal U2 As BigNum) As BigNum
'
Public Declare Function BigNumRand Lib "BigNum_ltm.dll" _
(ByVal digits As Integer) As BigNum
Public Declare Function BigNumRandBits Lib "BigNum_ltm.dll" _
(ByVal bits As Integer) As BigNum
' Compara dos BigNum
' Devuelve un entero con:
' 0 si son iguales (MP_EQ)
' -1 si el primero es menor (MP_LT)
' 1 si el primero es mayor (MP_GT)
Public Declare Function BigNumCompare Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As Integer
Public Declare Sub BigNumCopyTo Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByRef n2 As BigNum)
Public Declare Function BigNumCopy Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As BigNum
Public Declare Function BigNumIsZero Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As Integer
Public Declare Function BigNumIsEven Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As Integer
Public Declare Function BigNumIsOdd Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As Integer
Public Declare Sub BigNumSetToZero Lib "BigNum_ltm.dll" _
(ByRef n1 As BigNum)
Public Declare Function BigNumZero Lib "BigNum_ltm.dll" () As BigNum
Public Declare Function BigNumOne Lib "BigNum_ltm.dll" () As BigNum
Public Declare Function BigNumTwo Lib "BigNum_ltm.dll" () As BigNum
Public Declare Function BigNumNeg Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As BigNum
Public Declare Function BigNumAbs Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As BigNum
'
Public Declare Function BigNumPrimeIsDivisible Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum) As Integer
Public Declare Function BigNumPrimeIsFermat Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As Integer
Public Declare Function BigNumPrimeIsMillerRabin Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal n2 As BigNum) As Integer
Public Declare Function BigNumPrimeIsPrime Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal t As Integer) As Integer
''' <summary>
''' Siguiente número primo
''' </summary>
''' <param name="n1"></param>
''' <param name="t"></param>
''' <param name="bbs_style"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Declare Function BigNumPrimeNextPrime Lib "BigNum_ltm.dll" _
(ByVal n1 As BigNum, ByVal t As Integer, ByVal bbs_style As Integer) As BigNum
' Parse permite crear nuevas instancias a partir de cadenas o enteros
''' <summary>
''' Convierte una cadena en un BigNum
''' </summary>
''' <param name="s"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Parse(ByVal s As String) As BigNum
Return BigNumFromString(s)
End Function
''' <summary>
''' Convierte un entero en un BigNum
''' </summary>
''' <param name="n"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Parse(ByVal n As Integer) As BigNum
Return BigNumFromInt(n)
End Function
''' <summary>
''' Convierte un ULong a BigNum
''' </summary>
''' <param name="n"></param>
''' <returns></returns>
''' <remarks>
''' v.0.4 20/Oct/07
''' </remarks>
Public Shared Function Parse(ByVal n As ULong) As BigNum
Return BigNumFromString(n.ToString)
End Function
''' <summary>
''' Siguiente número primo a partir del indicado
''' </summary>
''' <param name="n1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function NextPrime(ByVal n1 As BigNum) As BigNum
Return BigNumPrimeNextPrime(n1, 92, 0)
End Function
''' <summary>
''' Devuelve un BigNum con valor cero
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Zero() As BigNum
Return BigNum.BigNumZero
End Function
''' <summary>
''' Devuelve un BigNum con valor 1
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function One() As BigNum
Return BigNum.BigNumOne
End Function
''' <summary>
''' Devuelve un BigNum con valor 2
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Two() As BigNum
Return BigNum.BigNumTwo
End Function
' #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
''' <summary>
''' Devuelve True si el BigNum indicado es cero
''' </summary>
''' <param name="n1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function IsZero(ByVal n1 As BigNum) As Boolean
Return (n1.used = 0)
End Function
''' <summary>
''' Devuelve True si este número es cero
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function IsZero() As Boolean
Return (used = 0)
End Function
''' <summary>
''' Devuelve la raíz cuadrada del número indicado
''' </summary>
''' <param name="n1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Sqrt(ByVal n1 As BigNum) As BigNum
Return BigNum.BigNumSqrt(n1)
End Function
''' <summary>
''' Devuelve la raíz cuadrada de este número
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function Sqrt() As BigNum
Return BigNum.BigNumSqrt(Me)
End Function
''' <summary>
''' Convierte el BigNum indicado en un entero (Int32)
''' </summary>
''' <param name="n1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ToInt32(ByVal n1 As BigNum) As Integer
Try
Return BigNumToUInt(n1)
Catch ex As Exception
Console.WriteLine("ERROR: " & ex.Message)
Return -1
End Try
End Function
''' <summary>
''' Convierte este número en un entero (Int32)
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function ToInt32() As Integer
Return BigNum.ToInt32(Me)
End Function
''' <summary>
''' Multiplica dos BigNum
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Mul(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumMul(n1, n2)
End Function
''' <summary>
''' Suma dos BigNum
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Add(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumAdd(n1, n2)
End Function
''' <summary>
''' Suma dos BigNum
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks>
''' v.0.1 19/Oct/07
''' </remarks>
Public Shared Function Sum(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumAdd(n1, n2)
End Function
''' <summary>
''' Resta los dos BigNum indicados
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function [Sub](ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumSub(n1, n2)
End Function
''' <summary>
''' Devuelve la parte entera de dividir los dos números indicados
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks>
''' v.0.1 19/Oct/07
''' Corregido el BUG que devolvía el resto en vez del resultado
''' En realidad no era un bug, sino una malintepretación
''' de lo que se debía devolver
''' En realidad el enunciado era:
''' Devuelve el resto de dividir los dos números indicado
''' </remarks>
Public Shared Function Div(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Dim n3 As BigNum = BigNum.BigNumZero
'Return BigNum.BigNumDiv(n1, n2, n3)
' n4 es el resto
Dim n4 As BigNum = BigNum.BigNumDiv(n1, n2, n3)
Return n3
End Function
''' <summary>
''' Devuelve el resto de dividir los dos números indicados
''' La parte entera la devuelve por referencia en el tercer parámetro
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <param name="n3"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Div(ByVal n1 As BigNum, ByVal n2 As BigNum, _
ByRef n3 As BigNum) As BigNum
n3 = BigNum.BigNumZero
Return BigNum.BigNumDiv(n1, n2, n3)
End Function
''' <summary>
''' Devuelve el resto de dividir los dos números indicados
''' La parte entera la devuelve por referencia en el tercer parámetro
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <param name="n3"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function DivMod(ByVal n1 As BigNum, ByVal n2 As BigNum, _
ByRef n3 As BigNum) As BigNum
n3 = BigNum.BigNumZero
Return BigNum.BigNumDiv(n1, n2, n3)
End Function
''' <summary>
''' Devuelve el resto de la división
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function DivMod(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumMod(n1, n2)
End Function
''' <summary>
''' Devuelve el resto de la división
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function [Mod](ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumMod(n1, n2)
End Function
''' <summary>
''' Decrementa uno al BigNum indicado
''' </summary>
''' <param name="n1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Dec(ByVal n1 As BigNum) As BigNum
Return BigNum.Sub(n1, BigNum.BigNumOne)
End Function
''' <summary>
''' Decrementa el primer BigNum por la cantidad del segundo
''' (es como restarlos, en realidad es lo mismo que Sub)
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Dec(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.Sub(n1, n2)
End Function
''' <summary>
''' Incrementa en uno el BigNum indicado
''' </summary>
''' <param name="n1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Inc(ByVal n1 As BigNum) As BigNum
Return BigNum.Add(n1, BigNum.BigNumOne)
End Function
''' <summary>
''' Incrementa el primer BigNum con el segundo
''' Es como sumarlos
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Inc(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.Add(n1, n2)
End Function
''' <summary>
''' Comprueba si los dos números son iguales
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Iguales(ByVal n1 As BigNum, ByVal n2 As BigNum) As Boolean
Return (BigNum.BigNumCompare(n1, n2) = 0)
End Function
'
'Public Function Iguales(ByVal n1 As BigNum) As Boolean
' Return (BigNum.BigNumCompare(Me, n1) = 0)
'End Function
''' <summary>
''' Compara dos BigNum
''' Devuelve un entero con:
''' 0 si son iguales (MP_EQ)
''' -1 si el primero es menor (MP_LT)
''' 1 si el primero es mayor (MP_GT)
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns>
''' Devuelve un entero con:
''' 0 si son iguales (MP_EQ)
''' -1 si el primero es menor (MP_LT)
''' 1 si el primero es mayor (MP_GT)
''' </returns>
''' <remarks></remarks>
Public Shared Function Compare(ByVal n1 As BigNum, ByVal n2 As BigNum) As Integer
Return BigNum.BigNumCompare(n1, n2)
End Function
''' <summary>
''' Factorial de un número usando BigNum
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Factorial(ByVal num As BigNum) As BigNum
If BigNum.IsZero(num) Then
Return BigNum.BigNumOne
ElseIf BigNum.Iguales(num, BigNum.BigNumOne) Then
Return BigNum.BigNumOne
End If
Return BigNum.Mul(num, Factorial(BigNum.Sub(num, BigNum.BigNumOne)))
End Function
Public Shared ReadOnly Property PI() As BigNum
Get
Dim s As String
' el valor que tengo en gsCalc
's = "31415926535897932384626433832795"
' Valor de la página
' http://centros5.pntic.mec.es/ies.de.bullas/dp/matema/conocer/pi_1500.htm
s = "314159265358979323846264338327950288419716939937510582097494459230781" & _
"640628620899"
Return BigNum.Parse(s)
End Get
End Property
'--------------------------------------------------------------------------
' Métodos de instancia
' Si hay métodos de instancia y compartidos que se llaman igual
' estarán definidos con los compartidos.
'--------------------------------------------------------------------------
''' <summary>
''' Devuelve una cadena con el BigNum actual
''' </summary>
''' <returns></returns>
''' <remarks>
''' v.0.5 20/Oct/07
''' Si es cero, devolver cero
''' </remarks>
Public Overrides Function ToString() As String
If Me.IsZero Then
Return "0"
Else
Return BigNumToString(Me)
End If
End Function
'
' Constructores
'
Public Sub New(ByVal num As String)
Dim bn As BigNum = BigNum.Parse(num)
With Me
.used = bn.used
.sign = bn.sign
.dp = bn.dp
.alloc = bn.alloc
End With
End Sub
Public Sub New(ByVal num As Double)
Me.New(num.ToString)
End Sub
'--------------------------------------------------------------------------
' Sobrecarga de operadores y conversiones
'--------------------------------------------------------------------------
'
' Conversiones
'
''' <summary>
''' Convierte un Double o cualquier otro tipo numérico a BigNum
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Widening Operator CType(ByVal num As Double) As BigNum
Dim i As Integer = CInt(num)
'Dim i As ULong = CULng(num)
Return BigNum.Parse(i)
End Operator
''' <summary>
''' Convierte un ULong a BigNum
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Widening Operator CType(ByVal num As ULong) As BigNum
Return BigNum.Parse(num)
End Operator
''' <summary>
''' Convierte un BigNum a una cadena
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks>
''' v.0.5 20/Oct/07
''' Devolver siempre ToString
''' </remarks>
Public Shared Widening Operator CType(ByVal num As BigNum) As String
Return num.ToString 'BigNum.BigNumToString(num)
End Operator
''' <summary>
''' Convierte una cadena en un BigNum
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Widening Operator CType(ByVal num As String) As BigNum
Return BigNum.Parse(num)
End Operator
''' <summary>
''' Convierte un BigNum en un entero de 32 bits
''' Se debe usar con una función de conversión
''' (conversión explícita)
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Narrowing Operator CType(ByVal num As BigNum) As Integer
Return BigNum.ToInt32(num)
End Operator
'
' Sobrecarga de operadores aritméticos
'
''' <summary>
''' Unario, devuelve el mismo número
''' </summary>
''' <param name="bn1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator +(ByVal bn1 As BigNum) As BigNum
Return bn1
End Operator
''' <summary>
''' Unario, devuelve el valor en negativo si era positivo
''' y viceversa
''' </summary>
''' <param name="bn1"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator -(ByVal bn1 As BigNum) As BigNum
Return BigNum.BigNumNeg(bn1)
End Operator
''' <summary>
''' Suma dos números
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator +(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As BigNum
Return BigNum.Add(bn1, bn2)
End Operator
''' <summary>
''' Resta dos números
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator -(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As BigNum
Return BigNum.Sub(bn1, bn2)
End Operator
''' <summary>
''' Multiplica dos números
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator *(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As BigNum
Return BigNum.Mul(bn1, bn2)
End Operator
''' <summary>
''' Divide dos números
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator /(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As BigNum
Return BigNum.Div(bn1, bn2)
End Operator
''' <summary>
''' Divide dos números
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator \(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As BigNum
Return BigNum.Div(bn1, bn2)
End Operator
''' <summary>
''' Devuelve el resto de la división de los dos números
''' </summary>
''' <param name="n1"></param>
''' <param name="n2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator Mod(ByVal n1 As BigNum, ByVal n2 As BigNum) As BigNum
Return BigNum.BigNumMod(n1, n2)
End Operator
''' <summary>
''' Sobrecarga del operador de concatenación
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks>
''' v.0.1 19/Oct/07
''' </remarks>
Public Shared Operator &(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As String
Return bn1.ToString & bn2.ToString
End Operator
' Estas dos sobrecargas es para evitar convertir una cadena a BigNum
' cuando los parámetros no son BigNum
Public Shared Operator &(ByVal bn1 As BigNum, ByVal bn2 As String) As String
Return bn1.ToString & bn2
End Operator
Public Shared Operator &(ByVal bn1 As String, ByVal bn2 As BigNum) As String
Return bn1 & bn2.ToString
End Operator
'
' Sobrecarga de operadores de comparación
'
''' <summary>
''' Devuelve True si son iguales
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator =(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As Boolean
Return BigNum.Compare(bn1, bn2) = 0
End Operator
''' <summary>
''' Devuelve True si son diferentes
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator <>(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As Boolean
Return BigNum.Compare(bn1, bn2) <> 0
End Operator
''' <summary>
''' Devuelve True si el primero es menor
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator <(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As Boolean
Dim i As Integer = BigNum.Compare(bn1, bn2)
Return i = -1
End Operator
''' <summary>
''' Devuelve True si el primero es mayor
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator >(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As Boolean
Dim i As Integer = BigNum.Compare(bn1, bn2)
Return i = 1
End Operator
''' <summary>
''' Devuelve True si el primero es menor o igual
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator <=(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As Boolean
Dim i As Integer = BigNum.Compare(bn1, bn2)
Return i <= 0
End Operator
''' <summary>
''' Devuelve True si el primero es mayor o igual
''' </summary>
''' <param name="bn1"></param>
''' <param name="bn2"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator >=(ByVal bn1 As BigNum, ByVal bn2 As BigNum) As Boolean
Dim i As Integer = BigNum.Compare(bn1, bn2)
Return i >= 0
End Operator
'
' Sobrecarga de operadores booleanos
'
''' <summary>
''' Devuelve True si no es cero
''' </summary>
''' <param name="bn"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator IsTrue(ByVal bn As BigNum) As Boolean
Return Not BigNum.IsZero(bn) ' BigNum.BigNumIsZero(bn) = 0
End Operator
''' <summary>
''' Devuelve True si es cero
''' </summary>
''' <param name="bn"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Operator IsFalse(ByVal bn As BigNum) As Boolean
'Return BigNum.BigNumIsZero(bn) = 1
Return BigNum.IsZero(bn)
End Operator
End Structure