-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfibcalc_test.go
232 lines (221 loc) · 16.4 KB
/
fibcalc_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
package fibcalc_test
import (
"fmt"
"github.com/psyhatter/fibcalc"
"strconv"
"testing"
)
// Fibonacci numbers obtained here
// https://www.numberempire.com/fibonaccinumbers.php
const (
f0 = "0"
f1 = "1"
f2 = f1
f10 = "55"
f20 = "6765"
f30 = "832040"
f40 = "102334155"
f50 = "12586269025"
f60 = "1548008755920"
f70 = "190392490709135"
f80 = "23416728348467685"
f90 = "2880067194370816120"
f93 = "12200160415121876738"
f100 = "354224848179261915075"
f200 = "280571172992510140037611932413038677189525"
f300 = "222232244629420445529739893461909967206666939096499764990979600"
f400 = "176023680645013966468226945392411250770384383304492191886725992896575345044216019675"
f500 = "139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125"
f600 = "110433070572952242346432246767718285942590237357555606380008891875277701705731473925618404421867819924194229142447517901959200"
f700 = "87470814955752846203978413017571327342367240967697381074230432592527501911290377655628227150878427331693193369109193672330777527943718169105124275"
f800 = "69283081864224717136290077681328518273399124385204820718966040597691435587278383112277161967532530675374170857404743017623467220361778016172106855838975759985190398725"
f900 = "54877108839480000051413673948383714443800519309123592724494953427039811201064341234954387521525390615504949092187441218246679104731442473022013980160407007017175697317900483275246652938800"
f1000 = "43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875"
f2000 = "4224696333392304878706725602341482782579852840250681098010280137314308584370130707224123599639141511088446087538909603607640194711643596029271983312598737326253555802606991585915229492453904998722256795316982874482472992263901833716778060607011615497886719879858311468870876264597369086722884023654422295243347964480139515349562972087652656069529806499841977448720155612802665404554171717881930324025204312082516817125"
f3000 = "410615886307971260333568378719267105220125108637369252408885430926905584274113403731330491660850044560830036835706942274588569362145476502674373045446852160486606292497360503469773453733196887405847255290082049086907512622059054542195889758031109222670849274793859539133318371244795543147611073276240066737934085191731810993201706776838934766764778739502174470268627820918553842225858306408301661862900358266857238210235802504351951472997919676524004784236376453347268364152648346245840573214241419937917242918602639810097866942392015404620153818671425739835074851396421139982713640679581178458198658692285968043243656709796000"
f4000 = "39909473435004422792081248094960912600792570982820257852628876326523051818641373433549136769424132442293969306537520118273879628025443235370362250955435654171592897966790864814458223141914272590897468472180370639695334449662650312874735560926298246249404168309064214351044459077749425236777660809226095151852052781352975449482565838369809183771787439660825140502824343131911711296392457138867486593923544177893735428602238212249156564631452507658603400012003685322984838488962351492632577755354452904049241294565662519417235020049873873878602731379207893212335423484873469083054556329894167262818692599815209582517277965059068235543139459375028276851221435815957374273143824422909416395375178739268544368126894240979135322176080374780998010657710775625856041594078495411724236560242597759185543824798332467919613598667003025993715274875"
f5000 = "3878968454388325633701916308325905312082127714646245106160597214895550139044037097010822916462210669479293452858882973813483102008954982940361430156911478938364216563944106910214505634133706558656238254656700712525929903854933813928836378347518908762970712033337052923107693008518093849801803847813996748881765554653788291644268912980384613778969021502293082475666346224923071883324803280375039130352903304505842701147635242270210934637699104006714174883298422891491273104054328753298044273676822977244987749874555691907703880637046832794811358973739993110106219308149018570815397854379195305617510761053075688783766033667355445258844886241619210553457493675897849027988234351023599844663934853256411952221859563060475364645470760330902420806382584929156452876291575759142343809142302917491088984155209854432486594079793571316841692868039545309545388698114665082066862897420639323438488465240988742395873801976993820317174208932265468879364002630797780058759129671389634214252579116872755600360311370547754724604639987588046985178408674382863125"
f6000 = "377013149387799945333900224880775791236117337930100445535490043525045843539648818562578569150145472631258140598040875416901451349878686710189798735122954887088454924500028574003068434783807870575430696066439101846750599745829545721693784957073273631818673420751972327938538799801845560513422262958882244516053880771140410978978788942838058153862334417256446852231577242261307228498349256708182071208335817888584565766108075330781175405119280446072770439376209526520001751104214901240319492664624851096737783185573483303395157215338535471110527043630771804782569715147171393026481175856948947183228899948494260568208750719855268516476269647878714108168277444438804007613683373880351707165423524328506540659186023484368510133227968867699680214790847184799670735773757954844122828271297646621289176554762574427786113873868257758061282170336001273324376526581229870956568892731479303850890073064863486442100376745831539591175879381143478831554126208085279063513741706269326525112915577755575469466383184602256762543155745636219359236200272816189871334546629683994275939790168821520825923115371290776425534079797676308190573421064864056358117445863611087717811034416870861710009856863627270553744159738699063771087537466728943484891875282416138475233419592000"
f7000 = "36643483050372328322763589672816049218571543934175989626270698720728011459961452615205304474088508634285133393772080143860609858437637289909505603382510796045818812761764843963097882756899306880632339149624457792521065549662450746982954629516070098764978344151183599533003076277908774345939181724390901980527597663311555613033194153844866587511336793498907902783405698117902719459066855627353047337434107530829780633602911908426389755252823713762551462513907377077479794770248229483843646633681833549215123470585482715472809087383941758904346522640847918233307726932886610834511442709077969599000511722444264347175538294548185363876202654698511562719377096542631053943527028083011034249574050544328985535168955291671366036244479158743237803279520401188053252788470288847800035137267512317663342926011439333402801452136904199295820198703432837127533865033077917441010089802284149246910370407338605473066356582210888458052852205569170152356850628426912688415908336529818984499627245623589210650557134791498344835054794775623211187554679169981434112608914574843324668332643775010924705690019102274575145613483922681596385654759233269444264241619526680808134173728034947587278323338845059843941403722357555875001230291335579485064878430855934357730321907669366710759730431158502094644082670389464425638942201877393180553647515377317433628216098889451332718516720207276058883659104584529812229076091130643430114436305262385420314059450210042195431947096493318081320875"
f8000 = "3561533204460626739768914905427460387141369539110154082973500638991885819498711815304829246223963373749873423083216889782034228521693267175594214186111978816819236959743284321273097535654614718808050244321699002512466203835566030351092652496815708455980825654877181538741827129421689128991879649533246136168998590044965735035810856774605383628378979290580539135791985063484992877932473487054068899476937399295193905527420792975902913836012199062687063537510151753758100626402591751183925883151617648375005313453493271681248233059858496951790113255897429539560654496639601132039360167542277472498901884679404509894269174519328918160745655327632006736189766801968534195725815421784083495026969542066047758885029695257263330719223956309043195653930347983496830801755572982419821881275569179922973415736010289561700699477021488635509784509168019589640190234350021673802856836365767446249424907273016689053388000785637444921523414602360860001530139933615215383220927084750528293779491002813557093860863839463287251443115581618266959802005566973874793475256663122039030056061200186123236430592279484254766158650545069933528061680141046574115103014532101595841822474764213889385114174543352137856680694687244097968099924183815689652779302937329729253678579649215884078334428338037327451220722810587680172255878795449524781554973097109174140632623167659027450550461045055883872225659796812847075286475208205923875668405160707778568995306926178023176315799965539425437791083258303238592641010878264249883586034912756021070468742995902773902487497010335873840408520900059054071283266816325489230566003110549946685475230821114509971542662742044237174282248020953398789607528748909125"
f9000 = "346160291286684746313289272940653195821004938840574649197792354882626761451249209476688158830845438584081783077248969641036805567685925275096026379667053520731117017902152350004056055263290740468312565519013758527115134986679500927618960595898784125436743322890902556558480966166842068858827121368084037500398689666218044551350360442646862696279483129043660912539980584260616428129687853518243358544506024804211410314325692133398509706576596745187284000675448960566587838629300214068490071678112576561242120168921521062906855593650494011391615760506296564726181583639595605639315514462323593255726350681177298919692687529131475966996479175735276726414564038873951028105275764984412066591637415934772279139455253087288034009154993561193308269619883651016764739580528775882659332284075160900251889565909001620005955898020498741253426259183467407856451935255744598735677063143605951074135853992415938277666700535092854704966755528337679057697026202081967337389133151551900992563506110333584028337592625787023110008351289364452178195306107056259768301902940710358705695173401175797592063874235214258319794748258830812224447883759078743189231351248058057742818858083652751310389157188583652487191753681908871324452598859106144951594606797195786754559141129782727790928218793262000601818878041232712620482141748965030717911922256234544033929372196985105014830841771293541916105669494308393067698504542986022441130160781328108216014215621166500631310190198456977407701085658980743316402172456165191576635035885104241740897029972735571913355609051794588175072614073380279274977928339443177725603335698391914343325635814053921690136602830888930385122496970174170881935462763316271613842866892088329627160809282789447665993788904319486227140536689107577971883772835153070545678359828373104418268785375257487856252266909918112168299229852218195022374231040315139836301079422737682650129388000"
f10000 = "33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875"
)
func TestUint64(t *testing.T) {
tests := []struct {
arg uint8
want string
}{
{0, f0},
{1, f1},
{2, f2},
{10, f10},
{20, f20},
{30, f30},
{40, f40},
{50, f50},
{60, f60},
{70, f70},
{80, f80},
{90, f90},
{93, f93},
}
for _, tt := range tests {
t.Run(strconv.Itoa(int(tt.arg)), func(t *testing.T) {
if got := fibcalc.Uint64(tt.arg); fmt.Sprint(got) != tt.want {
t.Errorf("fibcalc.Uint64(%d) = %v, want %v", tt.arg, got, tt.want)
}
})
}
}
func TestSequential(t *testing.T) {
tests := []struct {
arg uint64
want string
}{
{0, f0},
{1, f1},
{2, f2},
{10, f10},
{20, f20},
{30, f30},
{40, f40},
{50, f50},
{60, f60},
{70, f70},
{80, f80},
{90, f90},
{93, f93},
{100, f100},
{200, f200},
{300, f300},
{400, f400},
{500, f500},
{600, f600},
{700, f700},
{800, f800},
{900, f900},
{1000, f1000},
{2000, f2000},
{3000, f3000},
{4000, f4000},
{5000, f5000},
{6000, f6000},
{7000, f7000},
{8000, f8000},
{9000, f9000},
{10000, f10000},
}
for _, tt := range tests {
t.Run(strconv.Itoa(int(tt.arg)), func(t *testing.T) {
if got := fibcalc.Sequential(tt.arg); got.String() != tt.want {
t.Errorf("fibcalc.Sequential(%d) = %v, want %v", tt.arg, got, tt.want)
}
})
}
}
func TestConcurrent(t *testing.T) {
tests := []struct {
arg uint64
want string
}{
{0, f0},
{1, f1},
{2, f2},
{10, f10},
{20, f20},
{30, f30},
{40, f40},
{50, f50},
{60, f60},
{70, f70},
{80, f80},
{90, f90},
{93, f93},
{100, f100},
{200, f200},
{300, f300},
{400, f400},
{500, f500},
{600, f600},
{700, f700},
{800, f800},
{900, f900},
{1000, f1000},
{2000, f2000},
{3000, f3000},
{4000, f4000},
{5000, f5000},
{6000, f6000},
{7000, f7000},
{8000, f8000},
{9000, f9000},
{10000, f10000},
}
for _, tt := range tests {
t.Run(strconv.Itoa(int(tt.arg)), func(t *testing.T) {
if got := fibcalc.Concurrent(tt.arg); got.String() != tt.want {
t.Errorf("fibcalc.Concurrent(%d) = %v, want %v", tt.arg, got, tt.want)
}
})
}
}
func BenchmarkUint64(b *testing.B) {
// Most arithmetic operations are necessary for
// calculating 2^k - 1. This is due to the
// number of ones in binary representation of n.
// In the range from 0 to 93, these are numbers
// 0, 1, 3, 7, 15, 31, 63.
tests := make([]uint8, 7)
for i := 0; i < len(tests); i++ {
tests[i] = 1<<i - 1
}
var test uint8
for i := 0; i < len(tests); i++ {
test = tests[i]
b.Run(strconv.Itoa(int(test)),
func(b *testing.B) {
for i := 0; i < b.N; i++ {
fibcalc.Uint64(test)
}
})
}
}
func BenchmarkSequential(b *testing.B) {
// Most arithmetic operations are necessary for
// calculating 2^k - 1. This is due to the
// number of ones in binary representation of n.
tests := make([]uint64, 25)
for i := 0; i < len(tests); i++ {
tests[i] = 1<<i - 1
}
var test uint64
for i := 0; i < len(tests); i++ {
test = tests[i]
b.Run(strconv.Itoa(int(test)),
func(b *testing.B) {
for i := 0; i < b.N; i++ {
fibcalc.Sequential(test)
}
})
}
}
func BenchmarkConcurrent(b *testing.B) {
// Most arithmetic operations are necessary for
// calculating 2^k - 1. This is due to the
// number of ones in binary representation of n.
tests := make([]uint64, 25)
for i := 0; i < len(tests); i++ {
tests[i] = 1<<i - 1
}
var test uint64
for i := 0; i < len(tests); i++ {
test = tests[i]
b.Run(strconv.Itoa(int(test)),
func(b *testing.B) {
for i := 0; i < b.N; i++ {
fibcalc.Concurrent(test)
}
})
}
}