47 lines
2 KiB
Text
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
|