Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,12 @@
|
|||
Function Fib(ByVal n As Integer) As Decimal
|
||||
Dim fib0, fib1, sum As Decimal
|
||||
Dim i As Integer
|
||||
fib0 = 0
|
||||
fib1 = 1
|
||||
For i = 1 To n
|
||||
sum = fib0 + fib1
|
||||
fib0 = fib1
|
||||
fib1 = sum
|
||||
Next
|
||||
Fib = fib0
|
||||
End Function
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
Function Seq(ByVal Term As Integer)
|
||||
If Term < 2 Then Return Term
|
||||
Return Seq(Term - 1) + Seq(Term - 2)
|
||||
End Function
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
Function FiboBig(ByVal n As Integer) As BigInteger
|
||||
' Fibonacci sequence with BigInteger
|
||||
Dim fibn2, fibn1, fibn As BigInteger
|
||||
Dim i As Integer
|
||||
fibn = 0
|
||||
fibn2 = 0
|
||||
fibn1 = 1
|
||||
If n = 0 Then
|
||||
Return fibn2
|
||||
ElseIf n = 1 Then
|
||||
Return fibn1
|
||||
ElseIf n >= 2 Then
|
||||
For i = 2 To n
|
||||
fibn = fibn2 + fibn1
|
||||
fibn2 = fibn1
|
||||
fibn1 = fibn
|
||||
Next i
|
||||
Return fibn
|
||||
End If
|
||||
Return 0
|
||||
End Function 'FiboBig
|
||||
|
||||
Sub fibotest()
|
||||
Dim i As Integer, s As String
|
||||
i = 2000000 ' 2 millions
|
||||
s = FiboBig(i).ToString
|
||||
Console.WriteLine("fibo(" & i & ")=" & s & " - length=" & Len(s))
|
||||
End Sub 'fibotest
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
Imports System
|
||||
Imports System.Collections.Generic
|
||||
Imports BI = System.Numerics.BigInteger
|
||||
|
||||
Module Module1
|
||||
|
||||
' A sparse array of values calculated along the way
|
||||
Dim sl As SortedList(Of Integer, BI) = New SortedList(Of Integer, BI)()
|
||||
|
||||
' Square a BigInteger
|
||||
Function sqr(ByVal n As BI) As BI
|
||||
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 BI
|
||||
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 BI) As BI
|
||||
If n < 2 Then Return n
|
||||
Dim cur As BI = 0, pre As BI = 1
|
||||
For i As Integer = 0 To n - 1
|
||||
Dim sum As BI = cur + pre : pre = cur : cur = sum : Next : Return cur
|
||||
End Function
|
||||
|
||||
Sub Main()
|
||||
Dim vlen As Integer, num As Integer = 2_000_000, digs As Integer = 35
|
||||
Dim sw As System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch.StartNew()
|
||||
Dim v As BI = Fsl(num) : sw.[Stop]()
|
||||
Console.Write("{0:n3} ms to calculate the {1:n0}th Fibonacci number, ", sw.Elapsed.TotalMilliseconds, num)
|
||||
vlen = CInt(Math.Ceiling(BI.Log10(v))) : Console.WriteLine("number of digits is {0}", vlen)
|
||||
If vlen < 10000 Then
|
||||
sw.Restart() : Console.WriteLine(v) : sw.[Stop]()
|
||||
Console.WriteLine("{0:n3} ms to write it to the console.", sw.Elapsed.TotalMilliseconds)
|
||||
Else
|
||||
Console.Write("partial: {0}...{1}", v / BI.Pow(10, vlen - digs), v Mod BI.Pow(10, digs))
|
||||
End If
|
||||
End Sub
|
||||
End Module
|
||||
Loading…
Add table
Add a link
Reference in a new issue