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