September Morn Update
This commit is contained in:
parent
4e2d22a71d
commit
aac6731f2c
6856 changed files with 141342 additions and 21127 deletions
|
|
@ -0,0 +1,56 @@
|
|||
Imports System
|
||||
Imports System.Collections.Generic
|
||||
Imports System.Numerics
|
||||
|
||||
Module Module1
|
||||
|
||||
' A sparse array of values calculated along the way
|
||||
Dim sl As SortedList(Of Integer, BigInteger) = New SortedList(Of Integer, BigInteger)()
|
||||
|
||||
' Square a BigInteger
|
||||
Function sqr(ByVal n As BigInteger) As BigInteger
|
||||
Return n * n
|
||||
End Function
|
||||
|
||||
' Helper routine for Fsl(). It adds an entry to the sorted list when necessary
|
||||
Sub IfNec(n as integer)
|
||||
If Not sl.ContainsKey(n) Then sl.Add(n, Fsl(n))
|
||||
End Sub
|
||||
|
||||
' This routine is semi-recursive, but doesn't need to evaluate every number up to n.
|
||||
' Algorithm from here: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html#section3
|
||||
Function Fsl(ByVal n As Integer) As BigInteger
|
||||
If n < 2 Then Return n
|
||||
Dim n2 As Integer = n >> 1, pm As Integer = n2 + ((n And 1) << 1) - 1 : IfNec(n2) : IfNec(pm)
|
||||
Return If(n2 > pm, (2 * sl(pm) + sl(n2)) * sl(n2), sqr(sl(n2)) + sqr(sl(pm)))
|
||||
End Function
|
||||
|
||||
' Conventional iteration method (not used here)
|
||||
Function Fm(ByVal n As BigInteger) As BigInteger
|
||||
If n < 2 Then Return n
|
||||
Dim cur As BigInteger = 0, pre As BigInteger = 1
|
||||
For i As Integer = 0 To n - 1
|
||||
Dim sum As BigInteger = cur + pre
|
||||
pre = cur : cur = sum
|
||||
Next : Return cur
|
||||
End Function
|
||||
|
||||
Sub Main()
|
||||
Dim num As Integer = 2_000_000
|
||||
Dim st As DateTime = DateTime.Now
|
||||
Dim v As BigInteger = Fsl(num)
|
||||
Console.WriteLine("{0:n3} ms to calculate the {1:n0}th Fibonacci number,",
|
||||
(DateTime.Now - st).TotalMilliseconds, num)
|
||||
st = DateTime.Now
|
||||
Dim vs As String = v.ToString()
|
||||
Console.WriteLine("{0:n3} seconds to convert to a string.", (DateTime.Now - st).TotalSeconds)
|
||||
Console.WriteLine("number of digits is {0}", vs.Length)
|
||||
If vs.Length < 10000 Then
|
||||
st = DateTime.Now
|
||||
Console.WriteLine(vs)
|
||||
Console.WriteLine("{0:n3} ms to write it to the console.", (DateTime.Now - st).TotalMilliseconds)
|
||||
Else
|
||||
Console.WriteLine("partial: {0}...{1}", vs.Substring(1, 35), vs.Substring(vs.Length - 35))
|
||||
End If
|
||||
End Sub
|
||||
End Module
|
||||
Loading…
Add table
Add a link
Reference in a new issue