RosettaCodeData/Task/Arbitrary-precision-integers--included-/Visual-Basic-.NET/arbitrary-precision-integers--included-.visual
2019-09-12 10:33:56 -07:00

47 lines
2 KiB
Text

Imports System.Numerics
Module Program
Dim Implems() As String = {"Built-In", "Recursive", "Iterative"}
Dim powers() As Integer = {5, 4, 3, 2}
Function intPowR(val As BigInteger, exp As BigInteger) As BigInteger
Debug.WriteLine(exp)
If exp = 0 Then Return 1
Dim ne As BigInteger, vs As BigInteger = val * val
If exp.IsEven Then
ne = exp / 2 : If ne > 1 Then Return intPowR(vs, ne) Else Return vs
End If
ne = (exp - 1) / 2 : If ne > 1 Then Return val * intPowR(vs, ne) Else Return vs * val
End Function
Function intPowI(val As BigInteger, exp As BigInteger) As BigInteger
intPowI = 1 : While (exp > 0) : If Not exp.IsEven Then intPowI *= val
val *= val : exp >>= 1 : End While
End Function
Sub DoOne(selection As Integer, p() As Integer)
Dim st As DateTime = DateTime.Now, result As String
Select Case (selection)
Case 0
result = BigInteger.Pow(p(0), BigInteger.Pow(p(1), BigInteger.Pow(p(2), p(3)))).ToString()
Case 1
result = intPowR(p(0), intPowR(p(1), intPowR(p(2), p(3)))).ToString()
Case Else
result = intPowI(p(0), intPowI(p(1), intPowI(p(2), p(3)))).ToString()
End Select
Dim et As TimeSpan = DateTime.Now - st
Debug.Assert(result.Length = 183231)
Debug.Assert(result.StartsWith("62060698786608744707"))
Debug.Assert(result.EndsWith("92256259918212890625"))
Console.WriteLine("n = {0}^{1}^{2}^{3}", powers(0), powers(1), powers(2), powers(3))
Console.WriteLine("n = {0}...{1}", result.Substring(0, 20), result.Substring(result.Length - 20, 20))
Console.WriteLine("n digits = {0}", result.Length)
Console.WriteLine("{0} elasped: {1} milliseconds.", Implems(selection), et.TotalMilliseconds)
End Sub
Sub Main()
For i As Integer = 0 To 2 : DoOne(i, powers) : Next
If Debugger.IsAttached Then Console.ReadKey()
End Sub
End Module