In this article, we’ll finish up with optimisation, tidying up a couple of little things and look at some “final” benchmarking results. The code described here is the pre-release-4
version in the GitHub repository. I’m not going to show any code snippets in this section, for two reasons: first, if you’ve been following along, you should be familiar enough with how things work to find the sections of interest; and second, some of the optimisation means that the code is getting a little more unwieldy, and it’s getting harder to display what’s going on in small snippets. Look in the GitHub repository if you want to see the details.
Rader’s algorithm improvements
There are two things we can do to make our implementation of Rader’s algorithm go a bit more quickly.
First, so far we’ve always calculated the convolution involved in Rader’s algorithm using a transform for the next power-of-two size greater than the actual convolution size. This is based on the observation that powers of two usually have a pretty efficient FFT plan. It also allows us to avoid recursive calls to Rader’s algorithm if we end up with a convolution transform size that has large prime factors. However, obviously there’s no reason to expect that the padded convolution will be faster in all cases. Sometimes the unpadded convolution may be quicker because of specialised base transforms (e.g. an $N=22$ FFT takes about 3 µs while the power of two needed for the corresponding padded convolution, $N=64$, takes about 33 µs). As in other cases like this, the best way to deal with the question is to test empirically which is quicker.
Unfortunately, in order to do this, we’re going to have to change the types of some of the planning functions to run in the IO
monad. This is because we’re going to have to recursively benchmark different plans for the convolution transforms while we’re deciding just how to do the Rader’s algorithm base transform. This isn’t all that messy when you get down to it, but it made me decide that the default planning API should also be monadic, with signature plan :: Int -> IO Plan
, since there may be reads and writes of wisdom files going on during the planning process. To make it easy to decide which convolution approach to take, we also record the execution times of the selected transform plans in the wisdom files, so once a plan has been generated for a given input length, we can just read the timing information from the wisdom file.
So, in principle, what we do is quite simple. When we’re constructing a Rader base transform, we just determine whether the unpadded or padded transform for the convolution is quicker. We save the relevant FFT-transformed “$b$” sequence for the convolution and record the transform size that we’re using for the convolution. We can then set the code up so that everything works the same for the padded and unpadded case without too much trouble.
The second thing we can do is to try to avoid conversions between mutable and immutable vectors in the RaderBase
branch of applyBase
. Doing this effectively ends up being slightly messy, because what we really need is a specialised version of execute
that works on mutable vectors. I call this executeM
and it has signature
executeM :: Plan -> Direction -> MVCD s -> MVCD s -> ST s ()
taking a plan, a transform direction, input and output mutable vectors, and running in the ST
monad. This allows us to avoid a couple of vector allocations in the convolution step. The original convolution code in applyBase
looked like this:
let conv = execute cplan Inverse $
zipWith (*) (execute cplan Forward apadfr)
(if sign == 1 then bfwd else binv)
which did at least two vector allocations, one for each call to execute
, and possibly a third associated with the call to zipWith
(though that may possibly get fused away). Instead of this, we can use mutable vectors and the new executeM
to avoid some of these allocations (in particular, the multiplication involved in the convolution can be done in place), giving a slight speed-up in some cases.
There are a couple of other possibilities that we might explore, but we’re getting to a point of diminishing returns with this so we’ll leave it for now. (One particular possibility is to experiment with padding to other sizes instead of a power of two: any highly composite size that takes advantage of specialised base transforms would be good, and the best option could be determined empirically.)
Compiler flags
All the way through, we’ve been using GHC’s -O2
flag to enable the full suite of “non-dangerous” optimisations. Now, without getting into lots of messing around with specific GHC optimisation flags (of which there are lots), the best option for getting some more “free” performance improvements is to try a different code generator. Specifically, so far we’ve been using GHC’s native code generator, but there’s another LLVM-based generator that tends to give good performance for numerically-intensive code that makes a lot of use of Vector
s. Sounds perfect for us.
We can enable the LLVM code generator simply by adding the -fllvm
option to the ghc-options
field in our Cabal file. Benchmarking with this version of the code reveals that we get, on average a 17% speed-up compared to the native code generator (for code version pre-release-4
). Here’s a histogram of the speed-ups of the LLVM-generated code compared to that from the native code generator for input vector lengths from 8 to 1024:
1.05244031897248
0.963743600627491
0.931961289329561
0.93224761522285
0.947264875711808
0.92659561189943
0.905305035837386
0.832628223275681
0.931291017179891
0.966273780642196
0.941829026168194
0.949171318407216
0.943439977382738
0.939046643520132
0.957722140802244
0.910213927269674
0.961214877079652
0.794660853011878
0.91178028664853
0.917529420573993
0.907826790709158
0.805425686549305
0.879643660174976
0.808154410409529
0.837417772549392
0.917193589095891
0.894234582213008
0.915699534338577
0.925122460937026
0.894165913267138
0.966699306477892
0.882482223274525
0.863396461163997
0.878633966171333
0.875016526246948
0.868996020453305
0.896077537830065
0.850559977266995
0.917159201968766
0.798471429555276
0.8642120477022
0.903383755713734
0.824929342623959
0.88166259458636
0.874061652819158
0.869580185925691
0.88033071238122
0.881363755086047
0.858904938760706
0.961780232383833
0.796716677453264
0.801399969629395
0.842295830090548
0.845207611225441
0.796121521097552
0.884545221979207
0.759061339789604
0.862293208020415
0.876787269264349
0.869019209466159
0.874736960675178
0.919948484549157
0.836209061104246
0.832373551170287
0.872778040404262
0.856118627797577
0.873545145413546
0.804945776945542
0.956137688191692
0.864968251968581
0.847350756321035
0.839097346907303
0.814477880665038
0.889508403927967
0.8533038656117
0.761256154350629
0.827837758066341
0.865805922351558
0.847253427904907
0.785238644139046
0.889951977047002
0.893655398151388
0.815182731036954
0.851518291541223
0.89340845142892
0.78889310762893
0.797965526058581
1.03433137290734
0.762533521682859
0.823494334138154
0.814853278931339
0.820483843570467
0.787556422108773
0.801960947956207
0.794969837022505
0.736312272589061
0.86914295108155
0.809075133995224
0.819077786397516
0.749791830259736
0.868602672308836
0.86799272241481
0.83304735423269
0.866306141789508
0.737478356009534
0.791472386392478
0.90018976597745
0.883539696303863
0.777636375370075
0.856772677244313
0.789787749362994
0.852318750514246
0.812594443747026
0.854616965486094
0.837930550872471
0.851658223906933
0.776852638731867
0.794124212339041
0.843885658646829
0.825398708442419
0.802644675381312
0.850580529707276
0.863106209956301
0.84802355213607
0.864662466550007
0.878789982797906
0.853172782413889
0.843358721047291
0.879084741310126
0.852486974180997
0.880958515923011
0.730822547118574
0.805171130796048
0.790104816748994
0.828062671505572
0.835720819958955
0.85461177751645
0.772299915572331
0.858302316652476
0.888380595395674
0.854613866537792
0.705100952531419
0.793761336476277
0.812963776463257
0.857410122218767
0.859766830098765
0.843552256503313
0.771087542417166
0.869107526173836
0.84997729069053
0.810415980323161
0.847646965394981
0.803927721713599
0.879999605290764
0.887893352876251
0.867005436644342
0.840167424023941
0.845900120730139
0.766103738847846
0.730587576144722
0.83371695343999
0.829332667185718
0.881652549034348
0.858449010712449
0.855927767252239
0.722934432840815
0.778104796941868
0.779477456876357
0.881394993025833
0.815889398026689
0.884882109619103
0.727119906362312
0.809386580817056
0.842465248430373
0.827554251442433
0.82063433166099
0.857629155106988
0.861844577330117
0.781490333437551
0.818956338831358
0.797662018024215
0.871736737491071
0.840497284607876
0.751989386724812
0.771928867590687
0.797887957990168
0.819734704530058
0.860378853964783
0.843531461571738
0.838923730779773
0.867787310610545
0.86913650478728
0.814698353224251
0.857136391805232
0.806535738523959
0.775016163471249
0.849573965173498
0.846105040326569
0.766316784994453
0.860881815847723
0.854098378978241
0.845128306877828
0.840343035171069
0.820756582673544
0.845577169294666
0.822683474823585
0.767096198821415
0.842220821831635
0.880926558307682
0.760647022149937
0.87129797458002
0.837254793092686
0.780614984143943
0.830474012648503
0.874605421112823
0.741667463900475
0.7811273647031
0.813896929959134
0.812058481369659
0.746599923388857
0.848552414229375
0.741632494330616
0.852249456078546
0.873252081595062
0.77648596831951
0.741264859630924
0.864581334521661
0.788504789513442
0.796464094489702
0.820992263576079
0.783357613270366
0.743009774815679
0.829334942021056
0.828078224443311
0.875108932519018
0.886795311659002
0.826349753393723
0.860871334780163
0.851774235500315
0.827543007592983
0.773105055805101
0.763861996918486
0.803151871384671
0.810774360966234
0.85081852087029
0.851278306008834
0.843713125794054
0.780982882360374
0.779153526081754
0.787991265208364
0.851292462910008
0.855099649910118
0.857694983224144
0.755750050813069
0.854390979866743
0.855415882304001
0.876589100468537
0.827777073018583
0.786162298544507
0.879478237188692
0.833991257149631
0.825186163028938
0.840539404534123
0.806833139687941
0.780439848344537
0.848998033587016
0.858335472467709
0.711961477800522
0.846779158292132
0.85169365736207
0.749433840057294
0.763855149814444
0.818817366042914
0.786091640325543
0.782015302793959
0.68481251396519
0.814331647627071
0.788863102007391
0.854499286143074
0.838190081359508
0.829355494933916
0.819257250597647
0.773641750092803
0.801615945686548
0.837828011662174
0.830110282104668
0.845760976642923
0.797162224384594
0.871928213972045
0.871645585007309
0.750451502599893
0.826357525472589
0.807419741623003
0.843573711173788
0.800900608516007
0.804330400353783
0.7793064768227
0.820760676327265
0.869167097967885
0.881199914306575
0.857842177219516
0.768340560615675
0.752153377028867
0.70358766104788
0.82137700779644
0.840599683769358
0.848518525544256
0.826254619201571
0.798593534459328
0.716160455939141
0.84277212825862
0.812908422250371
0.767457200376808
0.769485014193441
0.752751356686632
0.805152876715233
0.864722414200345
0.76737056016324
0.867564927069997
0.862116884836568
0.840021763312132
0.796314521065349
0.872515743279342
0.864639726895049
0.758126455503294
0.864164095909887
0.739454489269252
0.848926156077698
0.831464629916491
0.838722496793492
0.841100838150485
0.806327301857313
0.776357636843031
0.73987578975606
0.812915221572417
0.887496659498511
0.829722530839381
0.766434637671443
0.749579624140402
0.711932603645938
0.786519353087248
0.711442342349084
0.783399732818392
0.867063851355597
0.772343698561593
0.791997568340553
0.805178176210819
0.815697361244756
0.87032785144098
0.857020979085122
0.737022707348134
0.702220933274163
0.84478786432239
0.924137330848254
0.832812352990996
0.817903348054378
0.842474672831475
0.83314871116218
0.8280062144719
0.784495477159197
0.747415822647535
0.809909852561337
0.849590556901887
0.820270804901155
0.751325096867819
0.717613832237912
0.790390689801502
0.783969586259727
0.797871502515798
0.832044581897426
0.855761364043146
0.84603130991059
0.768964869736751
0.841039968003341
0.747726820463687
0.72748229020587
0.774056580708402
0.858298385467909
0.806944602975838
0.849171083899882
0.815488332596752
0.834716529060949
0.852474080431683
0.821182049163898
0.824136522144883
0.837428462115658
0.822009296717942
0.80708809190219
0.857242350668384
0.831091560808217
0.864069990880686
0.824918601501028
0.803268058048539
0.811999274432107
0.849216035689032
0.842618326070755
0.797322461763732
0.835470342767359
0.772992445847372
0.855181577514516
0.823190108116154
0.824691741071972
0.838725277252122
0.873633845459171
0.810432695621463
0.791192844301742
0.818623668674434
0.770734539965661
0.770556856810762
0.738303592212578
0.801466092394887
0.721050500914703
0.820501254690437
0.820334666102133
0.836168009066191
0.790946395055056
0.838583391461645
0.749857494364995
0.821004892145144
0.820301196029515
0.759355705985485
0.803974101355254
0.835789551866731
0.719924865658823
0.83812433095292
0.840967172474133
0.760140792983527
0.770102967960922
0.862941716097654
0.852926035662134
0.851062522417908
0.728492330186638
0.804579532076071
0.870866579891682
0.7976471291098
0.786326388071553
0.854741751526465
0.863584402533512
0.747701276206668
0.742850869486622
0.739740922100927
0.75856101532849
0.816562283594862
0.822517345011873
0.813268124670259
0.811025958094364
0.760480609008414
0.832063181610761
0.802885495236863
0.724519976024516
0.753693292773487
0.851582210217457
0.762152726690172
0.731314957509002
0.831842227072932
0.82735768806154
0.705386755674072
0.757585140074305
0.715473381703412
0.711028473801613
0.837542802031279
0.838248046253848
0.791362694769826
0.838367516356212
0.773336577529352
0.843256274135755
0.826639907594953
0.762013587839558
0.800960012689983
0.877026653099864
0.749706983849598
0.738036772654572
0.842648289930936
0.857311241016674
0.849595713024602
0.854787130679551
0.875388778779291
0.809028280092945
0.886546683195939
0.890323587952932
0.86654114750938
0.87982668989675
0.790472178717122
0.828232000993893
0.869504408771582
0.859340580383746
0.815684051665177
0.894027526932688
0.771600756111267
0.797983756535787
0.808814837713056
0.776630662564512
0.884745715228819
0.79333617880333
0.848707981561639
0.756688287600476
0.869410379392937
0.804754489210018
0.844082429370352
0.889287313721126
0.876005427599644
0.800494468776284
0.77142712114411
0.866315844294301
0.788936393747412
0.800702620252742
0.771904703588709
0.784569096519979
0.82027707437477
0.845067092912841
0.857300645809096
0.723517000628143
0.845091625769789
0.855518663426561
0.777414538016003
0.773120641298394
0.830921461869603
0.793165669934941
0.852792139918794
0.761152507030018
0.826560567061301
0.85190522535097
0.841820832650923
0.793117671916772
0.780036934635186
0.828048608759255
0.87055232160353
0.776513463099501
0.916267726778191
0.770102207202173
0.884911307626108
0.923764223550285
0.883881052137324
0.899656778760871
0.864246745463143
0.860308557466085
0.786006236697224
0.901162608501265
0.93904586398009
0.903648082267975
0.933444947015812
0.913655000925839
0.842631373041246
0.845333333348913
0.828216960909357
0.87455680872839
0.900938265839488
0.915325984267702
0.781296839597627
0.767075113853872
0.827848457519628
0.882816910757244
0.883243049584682
0.872363947095607
0.850376990344293
0.87913052271662
0.889662947895348
0.857824895035262
0.771946760325433
0.897450684929767
0.921508796621271
0.965175854787775
0.781668509096511
0.820391941660037
0.84110748261077
0.79207767242239
0.854724848359955
0.788711967835297
0.778502373200251
0.793399255825629
0.90277635999521
0.826669119391874
0.790443994198453
0.801478139556927
0.847329307150599
0.864203921315108
0.86401529557919
0.869037042019913
0.874815344270521
0.758109665431334
0.87929034717991
0.803515992231748
0.852150512549607
0.838743605429762
0.911971659307853
0.888326478708239
0.918995340376392
0.891104473511629
0.785886028522187
0.916457418595438
0.834081113616276
0.806776302825434
0.83660615314949
0.863150135264816
0.869232470109966
0.874522555300379
0.820899172747772
0.874746527693308
0.83525178064699
0.850101653874434
0.765948731213874
0.808608493531803
0.835176402321796
0.88439898262533
0.827181139359263
0.856802275023476
0.914174907276343
0.859410441735268
0.807841320539497
0.804949703019537
0.79968670098377
0.741952346736583
0.797433607879379
0.832724624728327
0.721871776615257
0.916335870016036
0.857107108708873
0.821986286919309
0.874667386044399
0.778368322602107
0.892027213457752
0.889654520729182
0.845051781961317
0.837153566258392
0.814119057467093
0.830849492386315
0.732552829084376
0.838682337626625
0.879360477890897
0.842014081896415
0.829341637846134
0.827774240677431
0.799498997533064
0.811829476690923
0.811090639589983
0.714270664575615
0.772798317976526
0.860771145355928
0.873967583824117
0.688217407182588
0.899924146476079
0.836284705967669
0.865717671639708
0.806400697393636
0.918125247470427
0.745504432819657
0.888118515029017
0.894508891378426
0.863903606945564
0.866374241194829
0.80654485233653
0.762816267176269
0.823440894395537
0.836110467433496
0.898986247602091
0.823512657150508
0.773506958822561
0.865736501092419
0.85862001981996
0.751508500177247
0.746100036795737
0.746543235503184
0.845820623610577
0.818982931753248
0.800208087506291
0.819322867008355
0.845564816218009
0.805182474363679
0.807240728825476
0.820030577847678
0.808097007701015
0.817107957041464
0.816200184141528
0.758628432611322
0.793512243703041
0.723279103519209
0.821908461558485
0.8847215803231
0.809537179390113
0.741545697305162
0.812856923691803
0.791119542073137
0.787216219534629
0.731173236613738
0.742913542926291
0.831926540941896
0.70973881690631
0.751750893930522
0.786964899947718
0.800804440887047
0.712076191026775
0.735027323696645
0.791248938450461
0.775291981844543
0.882415526083172
0.889395168491388
0.758562942781436
0.808332218519816
0.8256134857236
0.819823385856714
0.838240256495804
0.739002317872295
0.827537098148779
0.837760630474419
0.906580030278852
0.773827872582427
0.860102927899598
0.869884266813434
0.77227893730102
0.770341622401125
0.743057366057318
0.753036941229513
0.846859390531386
0.79301363816758
0.899832137735555
0.848743388452746
0.826028754193106
0.787835522414094
0.865908107331836
0.862182722042402
0.89626055663776
0.90034255972639
0.844494232673807
0.858763178358024
0.827212782983216
0.831577717112743
0.800955400363091
0.842234433035433
0.769332474599608
0.872727112486682
0.837726039387983
0.784294900679117
0.925914344908217
0.835379499818658
0.86644518561184
0.727322210202352
0.782794620082892
0.742811945418305
0.682595851938926
0.713283629411802
0.83372150361507
0.786708077685485
0.823988837999932
0.866385629711783
0.788230077971434
0.846998254400185
0.813819667358532
0.845634351128485
0.910577387017404
0.879919244584013
0.889972731067391
0.834619189140998
0.888204075575039
0.853368357341649
0.860792066891498
0.901021715682968
0.778648619468803
0.827368016861152
0.7423698310687
0.797696312669282
0.780147188961232
0.779084712711395
0.847225652756616
0.82880697395792
0.795855029402935
0.754390848750533
0.879259747592127
0.771742877409265
0.845345379108353
0.902036326293642
0.836490744630964
0.848049941422824
0.873270757117502
0.865244986024917
0.878135585987939
0.827282430445656
0.865661444432269
0.892612941200488
0.899105928354752
0.74850366231174
0.866798373540923
0.899985912556306
0.873177109485688
0.857505911203368
0.886753359118435
0.841611539304978
0.907775091810807
0.885084672984438
0.88232228909841
0.785295642282507
0.822986899364814
0.823245231133693
0.828898839943932
0.954016014290808
0.840568173934346
0.872754930329494
0.884291044171533
0.868599277408849
0.815389265008108
0.829104580184869
0.84640359633147
0.833809719689428
0.857985904800948
0.896163705674645
0.819477998654736
0.872669823321358
0.91209928589645
0.907774520156003
0.830155860234269
0.839660749796558
0.851378708692762
0.846174410056969
0.876365650263634
0.742867758817161
0.954232098428304
0.755834268862333
0.804964840519329
0.842306903627508
0.827047282945842
0.784102526458204
0.857844440094726
0.821277470899465
0.779503730381804
0.87419177443334
0.732558846903309
0.902941142122641
0.782501106534749
0.776007437573304
0.875289884365872
0.89936166150934
0.741897717063947
0.769174904017063
0.857721650192313
0.771076087417529
0.86867800029826
0.85154529897666
0.856468492190296
0.837423450668859
0.826860856825276
0.916764391282027
0.848183724755608
0.715877402896954
0.851577057588681
0.868301464066147
0.909327894875292
0.750008506376467
0.862684708136944
0.82248773261676
0.779616345792386
0.747243032243018
0.922731823185466
0.875699970227932
0.897343407988988
0.886923912932727
0.723498486778963
0.754079485535401
0.831246857036462
0.759900519324741
0.875029807330289
0.864244259224625
0.807855340127217
0.833934503733648
0.803660255123202
0.872007276386758
0.969113680013422
0.857113097296137
0.847809114538051
0.788098647065277
0.906209939176726
0.782167448118713
0.734553456153857
0.838481630955225
0.82570135813595
0.806478295204552
0.811278037658163
0.761410382473865
0.810607740932749
0.775917001071465
0.771006405639151
0.729120407458795
0.77961160610813
0.85472281307863
0.860045398316728
0.876782765907744
0.757112904080706
0.785999720468068
0.77018729104408
0.745710390109575
0.799798990566601
0.80308975917059
0.738215311463622
0.74717956339214
0.809019866193458
0.810062702442329
0.849052638153784
0.853025974729656
0.8319870015621
0.841611850761867
0.847740026774991
0.71337717598631
0.748430991532157
0.913238217174339
0.839389677144017
0.828129658733459
0.826646896726394
0.809467851540674
0.716659591985141
0.866649930686233
0.754966193765379
0.880912697418699
0.880879239587827
0.795736693501123
0.82620892812894
0.90394941900709
0.751160052903302
0.832889942540265
0.901586303712888
0.757839633806517
0.860833299786589
0.795023330515327
0.76749524076925
0.804515423693265
0.801777734603445
0.880116650372584
0.767854952270867
0.707201835180963
0.755198704637607
0.851260196402785
0.908760699545556
0.86713543174194
0.916050898230416
0.871718780840166
0.861182398281583
0.78238418065833
0.920398228946103
0.863678087302624
0.83417608166993
0.904182109741157
0.848861850091504
0.772583850492239
0.970246725128332
0.872622004345513
0.857387451650762
0.741541709208255
0.944420907369366
0.920642966927199
0.838506203772232
0.792012040306128
0.806824763480195
0.863317653805443
0.751057060323939
0.907111190481545
0.79489859376045
0.799322743799463
0.789952251181145
0.798746816514525
0.859225794450341
0.848025013197521
0.807059559806975
0.792498633437368
0.903314078607686
0.92678041359083
0.867946514803042
0.750787595877541
0.928373551491665
0.764346311920935
0.904951075817293
0.879971774659337
0.873878361898319
0.758990542297091
0.886460810309059
0.852161383154553
0.839808396449532
0.87369898294028
0.844879855164588
0.724696677758059
0.812073868246767
0.86318661119882
0.898967765177799
0.762248003467174
0.839070509151166
0.862512038569583
0.915328012575352
0.905841926604032
0.787570014868761
0.881163827006747
0.826030174164938
0.850229668109661
0.753384609875482
0.731240988815286
0.717573371638048
0.856845387440207
0.797337340824378
0.838602189759803
0.694801673673559
0.78592572017134
0.814978271863107
0.828942411914391
0.721505259488582
0.820594420258562
0.828398199045805
0.804888897827744
0.817546764854064
0.776985043358247
0.811783978355165
0.729620011215467
0.824397959350228
0.824499113505605
0.809812051516555
0.816583828390477
0.715627313972642
0.725860821618945
0.79270024779958
0.778951913025012
0.810269481018692
0.798798081539445
0.746174575327272
Final benchmarking
We can benchmark our final pre-release code version (pre-release-4
) in the same way as we’ve done before. Here are the results shown in the usual way:
Size FFT FFTW
8 0.3876487521157585 0.22610646900817707
9 0.4040362621392692 0.24952405139610367
10 0.41976656161115544 0.2597171216824601
11 0.4827029112296101 0.2858073248754566
12 0.4825251638391707 0.29104777697019724
13 0.5459175298700899 0.3318301329658772
14 0.5282560003392216 0.33064482663763445
15 0.5726726906482985 0.34729216753780645
16 0.5836267112779879 0.35449756701772894
17 2.4140906458896967 0.491571608449439
18 2.532748213229658 0.4261638671770866
19 6.524682218794835 0.5439286316062765
20 0.7332278590174395 0.42935310272072363
21 3.1757468436476497 0.47082918679438596
22 2.8078729970786815 0.49926138480035764
23 6.77071394100463 0.6740530556157257
24 2.8251680868295184 0.5059985334645506
25 0.906571284338316 0.5394891572786834
26 3.0114605263439342 0.5714040690389824
27 3.4068906725012593 0.5817709787511117
28 2.9387450950931973 0.5881545070147131
29 6.931523044892982 1.8166656472853275
30 3.0029936556909225 0.6242836860257268
31 7.032738908796958 1.9764060952833749
32 1.0875933242065596 0.6110964419120347
33 3.8010996068184055 0.7090859976247579
34 6.993187332141496 0.9202332692218929
35 5.195615485302241 0.7359392443315164
36 3.8889414023175384 1.740371701972827
37 9.307707459570794 2.21959304596697
38 15.046622966873434 1.0608113825817964
39 4.1614660577915705 0.8222182757031486
40 3.4360293555450627 1.847660062568531
41 8.78351473488977 2.4103279092482204
42 4.034588933349073 0.8562280392436751
43 10.03705473678125 2.555763242500172
44 4.951262250700909 0.8971136959871407
45 4.2326172559621025 0.9004380058198389
46 15.50015182492614 1.3271150023548666
47 18.202244902281144 2.6702041604689217
48 4.259229580808425 1.964485166328297
49 7.702283980517129 1.0082275379289642
50 4.178450278509392 0.9726104241967578
51 9.768291344058866 1.3520153678220892
52 5.484833903323636 1.0329210041474475
53 13.07926472576791 2.9706115701368887
54 6.944109192682275 2.083694455879079
55 6.237029637121791 1.1124055472126637
56 5.367024786095375 1.0724541956668014
57 22.044061215683104 1.537206402689509
58 16.30646324155119 2.705966947334156
59 18.89007312226661 3.3282394387892302
60 4.789786071220809 2.162372586982595
61 12.088306850837494 3.6119575479200887
62 16.473053836795906 3.061210630195483
63 8.592757885259042 1.2575942435418936
64 2.89954291633475 1.1353916329834564
65 6.897967896919883 1.282200478413421
66 7.789204201490659 1.3005995562963661
67 18.225825479556672 4.074489591377119
68 12.8497788672145 1.700390237194086
69 22.914408190460332 2.0006329127688396
70 6.790368554520084 1.3190073788964845
71 16.27412739503847 4.539405820625164
72 7.934271789719766 2.5796051004103284
73 18.39948908485 4.90657043244157
74 19.92496450016381 3.5308952310255575
75 5.851398066461159 1.3903569401899323
76 29.406960362927155 1.9434959555750226
77 9.442406593469983 1.524305627883382
78 8.531861469230936 1.5026866981551106
79 19.93692155314603 4.990016935127117
80 6.446089316095214 2.803718564765796
81 11.01539085323372 1.5600438017920364
82 18.983542566683216 3.881370542304853
83 35.72721512247467 5.609905240791178
84 8.516114947148626 2.851402280586108
85 15.97545661452692 2.1386490174777535
86 21.66732012427279 4.1579360940626655
87 23.84539011542744 3.740703580634932
88 10.934604392546413 1.6496039517381134
89 25.268274199247685 3.9175045125562105
90 8.881918029770956 2.9610748269728266
91 10.402671273282333 1.7557747764004965
92 30.243719967880427 2.486334062901442
93 24.187606672768464 3.998195646064618
94 38.57353515618915 4.56324767853532
95 36.3744893460085 2.455798225677392
96 6.628479368112879 3.054058072822435
97 16.465066814396003 5.917465207832192
98 10.337390228254456 1.827028539368373
99 12.19877253443776 1.9392166533848907
100 7.835415739159123 3.1684989907911842
101 19.175797780323965 6.685173032539223
102 19.578291935675438 2.522175455359774
103 36.946135414912106 4.96940510688756
104 11.960629156638626 1.8994316642135847
105 10.892671246665284 1.9618571320441285
106 27.895866076107165 5.259429929511881
107 37.15846040507871 5.124104474425837
108 12.14228561819381 3.259098050849778
109 28.78308113756943 6.649410245673988
110 13.872359315532112 2.064202052859768
111 30.320393215477868 4.799282071845866
112 11.180022652926189 3.435527799384933
113 25.69960448317 4.8852495526656545
114 33.91296220431614 2.88774119666922
115 37.62135947085161 3.119672518504968
116 31.757863635057934 4.670536039131023
117 13.329266662576375 2.301140646136085
118 39.85541985245241 5.941307065742349
119 23.330093049129143 3.005236666203116
120 10.500880740920833 3.4498329141310267
121 17.8983359272991 2.494128006062425
122 26.01679469085705 6.308471677558755
123 28.4057457294417 5.354797361152507
124 32.12847156054259 4.875576017158367
125 10.086225105038322 2.4895056050390263
126 13.318776245095904 3.695404050605635
127 30.914404491996066 6.885444638984536
128 8.923568933174032 4.4774169900587575
129 32.19697328887956 5.803024289863443
130 15.207609393355717 2.462266623421083
131 34.199511678539274 8.04892730500016
132 16.165324429405942 3.843223569648603
133 35.2696973900486 3.43131628724169
134 38.38184661859154 7.645999906318518
135 13.939116517680558 3.8622970559767285
136 26.703657656256386 3.354002695534676
137 56.996238210834285 8.089458463447425
138 45.513610576687796 3.754767266180753
139 75.57537354351506 6.384267359819217
140 12.839137700867347 3.960048673408369
141 57.867813607828225 6.26794051911149
142 34.97970510778346 7.6340789773634405
143 19.803190404686323 2.9416772608124737
144 14.304883116012167 3.7955398538282914
145 39.63867568963279 5.4573173501661785
146 39.498523038913746 8.313571927802894
147 24.88392215300962 2.9741823797545313
148 40.61973201860856 5.993759153144692
149 76.07592010486223 8.218204496162269
150 12.524014706861452 4.086410520332197
151 30.07628510210229 8.177673337715003
152 37.57708173473272 3.8146764711340793
153 29.82041861789375 3.8782589931929046
154 20.00750790217094 3.1188315989482467
155 40.16354417794253 5.941307065742349
156 17.953916652753772 4.379665372627117
157 40.383914369460825 6.652973695224062
158 42.151806116037605 8.540069577949378
159 42.07469260685944 7.281219480293129
160 11.768236674414654 4.196083066718915
161 49.85632408981916 4.399273995934186
162 23.050101247290378 4.680072782295085
163 51.00635059055063 9.581958768623204
164 38.30194233479551 6.697093961494301
165 20.66284286972535 3.1334032344087954
166 75.13231235068469 9.853755948798987
167 77.3608637914535 8.202511069202234
168 17.96649185177826 4.3939704873732115
169 25.713208366801094 3.4758020673424084
170 34.257018553850415 4.2704203556677225
171 39.548726862062615 4.465063133232651
172 44.23125305168688 7.076179502265785
173 77.24509832582302 8.264241637240199
174 48.67766284935026 6.530200956123207
175 15.431079776783305 3.5935622488051093
176 22.109280796338236 4.827892301338054
177 61.40025797747562 8.385097501533362
178 53.17830703726839 8.39437491892438
179 77.28492018743229 8.637499416561798
180 16.205187479627664 4.520332334297039
181 37.99717527110962 10.101711271064612
182 22.70262672157563 3.8155632400441752
183 39.01810960202413 8.768951413886878
184 52.442642669592544 6.704246518867349
185 51.24715335544319 7.18823623444352
186 49.22513297744214 6.744777677314613
187 36.35238729935125 5.005691514025086
188 77.63104786579858 8.01078033234391
189 27.749487002646262 5.185520169990398
190 41.401905178957236 4.883092683896492
191 80.76555094986905 10.182773587959144
192 13.55470357620247 4.641925809638836
193 32.63193159098072 10.013496396797034
194 35.92439373113704 10.16846847321305
195 22.76917839046623 3.7523871151226458
196 23.68766541312924 5.276119230048991
197 52.90069244376248 8.349777989404108
198 25.724812874386263 5.314266202705241
199 58.00464514018217 8.473863553383788
200 17.432824815994955 5.12353133942399
201 57.56844280067812 10.459339139716956
202 41.044117089409326 11.64904784943375
203 57.53924099595413 7.18823623444352
204 37.71371078485297 6.225025174873209
205 48.64053767060443 8.122837064521644
206 77.06535720813368 11.787330625312658
207 55.77673164994586 5.812728612949221
208 24.25197968912588 5.159294126289225
209 44.07485046379623 5.719060213128795
210 23.00237642481848 5.159294126289225
211 52.54451722356972 11.489307401435704
212 56.61467361441321 9.205257413642736
213 52.4508003820921 10.697757718818519
214 77.50616666993928 11.663352964179845
215 54.92031224559812 8.695041654365394
216 26.518772354083406 5.3500289895704745
217 57.91736320818061 7.731830594795082
218 59.825069774184136 11.517917630927892
219 59.26888557093116 12.345230100410314
220 24.675556614673688 5.359565732734538
221 40.213007421991854 5.908605414487071
222 62.654122959386974 8.344566343086097
223 79.33335652058364 12.242710111396642
224 17.878331519433207 5.357181546943521
225 19.152785204428092 5.638515470283364
226 55.03981955837276 11.74203109528336
227 79.8841034383082 12.278472898261876
228 45.33155479424058 6.918823240058754
229 79.6195990617285 10.202166957693377
230 58.16925762001404 6.332645651278421
231 31.2781314405789 4.834648146289666
232 64.66411009278832 7.8820342996290655
233 79.60487320831339 10.151042878611152
234 28.49989570450819 6.124889371650552
235 97.76710864460594 9.608184812324376
236 80.46205812329494 10.564243314521644
237 63.725649152381905 10.35380485112474
238 40.5402310278421 6.36184004276115
239 81.26258356418425 10.464361069677496
240 21.633201536550185 5.7577247598341454
241 50.560782945991235 14.18820571686539
242 39.31781578057707 6.489669797675942
243 35.020863683544164 5.089873730901596
244 52.66370437613552 11.360561368720859
245 42.570865138815854 5.139177337280543
246 59.02663156251361 9.577190397041175
247 48.40458842678644 6.74821355983215
248 65.47927436817972 8.537685392158362
249 112.99609438560542 11.643316971609618
250 22.14908459977736 6.382381437080238
251 51.82816109282306 12.624179837959142
252 28.35867074190847 6.2345619180372704
253 61.62870632508745 7.4059754071795165
254 64.20611935559988 12.013828275459142
255 42.488649183635324 6.2966229768625
256 18.66741196311537 5.905544278877115
257 44.25846007767278 14.450466153877109
258 67.9608351053824 10.330593107002112
259 74.25731616538202 9.598648069160314
260 31.249350865631293 6.182109830634928
261 72.6987142059812 8.94776534821305
262 72.11960802568977 14.54344939972672
263 152.8358366222135 12.985131458150695
264 35.20048366443359 6.465827939765785
265 70.23145836266806 11.296188352363439
266 49.527306450659 7.213755338076758
267 79.79504708670264 11.969088745097833
268 77.50987512912582 13.267910001533359
269 160.0795228743838 12.962416016208234
270 29.954696485684032 6.582653043525551
271 68.22490272511334 14.197742460029454
272 44.06602897636945 7.96071243073258
273 34.695924256921245 5.733779874046027
274 116.24772644025222 14.421855924384923
275 29.7597760517919 5.923090667715148
276 63.70078550056133 8.675968168037269
277 138.35643882730173 12.663510322550337
278 155.07167307512157 14.517223356025548
279 74.34725295160966 9.670173642890784
280 28.551046837653438 6.456291196601723
281 65.85870070674389 12.617545971483162
282 119.17221866935101 11.55606460358414
283 160.2970136004309 13.01526942617864
284 70.3551850568755 13.809120176093908
285 51.70955322257105 7.384542177497435
286 43.34641770386753 7.543479917304848
287 71.52945930068206 10.859882352607581
288 22.778509600372452 6.892597196357582
289 72.84296417224502 9.329066558607993
290 81.75551366792729 9.658252713935704
291 54.784910360883345 14.374172208564609
292 80.43667355693178 15.389835355537267
293 161.16485722836046 15.3183097818068
294 35.3570966218087 7.176315305488441
295 101.68515073319715 13.058101651923986
296 84.76584625230839 10.383045194404456
297 39.035780626122246 6.489811747671425
298 156.2126384308886 14.71749496247086
299 67.84522113789404 8.791162528229805
300 26.349495162921286 6.771003721015785
301 79.74736337088234 12.08535384918961
302 63.43114544086314 14.841472623603673
303 63.178875877642334 16.6153068521193
304 53.34834716788361 8.821403501289222
305 67.41332588185158 13.928329465644689
306 61.50331982689635 9.157573697822423
307 132.54355545022662 18.000518796699378
308 42.68599823975619 7.7032203653028954
309 116.66972732526195 16.90856170441422
310 82.81856250749637 10.428344724433753
311 163.19883261762905 16.34504634575458
312 37.68463696367921 7.388507840888832
313 85.96881699548769 16.501390339389477
314 85.2528162001233 14.912998197334142
315 36.57624301389148 7.579242704170082
316 86.00621891008424 15.685474393623203
317 162.77020899431088 15.461360929267736
318 86.74255447373504 13.601696012275548
319 93.66545758913367 10.976707456367343
320 24.048883155500757 7.021343229072426
321 118.10639794649813 17.16843795563492
322 69.93920737807463 9.302308756139848
323 85.99399995790529 10.791035713670855
324 39.58463414503639 7.5959320047071905
325 38.439453685922274 7.126089927986671
326 107.02664389960712 18.384372709052894
327 90.86528854355926 16.901409147041175
328 79.78074197195657 12.109195707099765
329 139.9600421903388 12.996112821357578
330 43.62225252780176 7.951175687568518
331 100.36467906391742 18.02674484040055
332 151.41724607655925 17.630969999091953
333 94.26746450136508 11.94945525910172
334 158.47205183217451 18.372451780097812
335 99.39465604494421 16.631996152656406
336 37.91914812717882 7.781898496406408
337 85.46322059618043 16.614889356798805
338 55.27943023036985 8.492385862129066
339 83.61368846880008 15.115195100933507
340 50.697941674047705 9.632026670234533
341 96.94132886598914 11.942302701728673
342 77.53315600214397 10.464107511298987
343 63.84951328085802 7.427109146106334
344 89.63441289251759 12.884056089179843
345 71.6545800101899 10.695373533027503
346 158.34727944244474 18.649017331855628
347 162.48145760406567 18.415367124336093
348 96.87865883948243 11.367713926093908
349 162.9225319754037 16.699164056751343
350 34.12588833534456 8.077537534492347
351 44.38727831833861 7.571840616565939
352 35.25424421150021 8.134757993476722
353 81.01596903787663 16.64325489995203
354 123.40848333166014 15.451824186103671
355 89.64363174424284 15.823016984096812
356 107.97298225973343 18.293773648994296
357 73.90750312793347 9.624110871451615
358 158.54834577748704 18.916046140449374
359 164.32165050479992 16.74002304074488
360 35.32691784903297 8.051311490791175
361 167.7843823430262 12.340238658640516
362 80.19264512891019 18.668090818183753
363 56.50748459489213 9.179031369941566
364 46.80657919514651 8.683120725410316
365 101.58153035074147 18.632328031318515
366 81.67445135103277 16.236221311347812
367 166.00935602161505 19.905483243720862
368 73.85743522632212 11.238967893379064
369 89.34481379176887 13.825809476631017
370 104.70371334352986 13.210689542548986
371 103.87346649153555 15.50666045929703
372 98.91867038166642 12.378608701484533
373 165.47529840442755 18.691088252567813
374 74.4787805344141 11.582290647285312
375 34.130289909112584 8.685504911201331
376 159.03101094540162 14.59828567292008
377 102.09339670018173 12.879287717597814
378 43.81840958126951 8.89292907501969
379 98.85804394298063 18.33192062165055
380 61.884681181377395 10.87657165314469
381 98.22708620328685 17.373477933662265
382 159.1984337698372 17.821704862373206
383 167.1594276425562 16.829030869855366
384 29.74325769592997 8.225357053535316
385 54.12683151236607 8.47278833084208
386 71.06178243525495 18.751537320869296
387 101.00675817619975 14.655506131904453
388 76.37420823827144 19.07578658844742
389 158.00528123620023 19.555007932441562
390 48.93302606645401 9.183799741523595
391 114.39501539848384 13.916196646127675
392 46.9514390352765 9.066974637763831
393 109.8565190631363 21.045124051826345
394 109.21219285311439 18.813526151435706
395 109.8326772052262 17.05957258197649
396 52.550385988593746 9.24102020050797
397 116.10129769625401 18.06600560365841
398 121.04272079448421 18.858825681465
399 93.96365111199569 11.245706971468671
400 36.49505182208932 8.532917020576331
401 85.07593941675233 22.196685788886903
402 117.51651064537097 18.718158719795078
403 116.1195764539851 13.811504361884923
404 84.14342474924135 21.34791564728533
405 44.665095392792 9.472286222236486
406 104.92672641444337 13.646995542304845
407 124.56091204537199 15.067970273750158
408 76.8427007462061 11.801635740058751
409 165.5533804890833 21.30500030304705
410 99.68126923682131 14.884387967841954
411 177.1250262257776 21.014129636543146
412 163.89104122562074 21.943962095039247
413 145.02476806619327 18.067275998847816
414 104.83025858936071 13.11055373932633
415 191.1418658662207 20.16608269531717
416 45.47645016366918 10.058795926826331
417 232.02576827967437 21.33122634674822
418 86.9840331076245 13.003265378730624
419 167.05511951419928 19.892727954538316
420 43.24141858411687 9.708320615547033
421 98.99411283205355 20.575847221111047
422 109.04990064164447 21.636402127998224
423 176.1299266812524 16.724979398506015
424 116.86264769218505 17.764484403388828
425 60.473893425584635 11.472945840931494
426 108.49108417201182 19.872104642646644
427 97.97759819015562 18.882667539375156
428 159.0747210182368 22.12516021515643
429 62.88777316690651 10.809814450996253
430 113.36782868685458 15.93819808747086
431 167.17194461795904 20.4723051804435
432 46.67906636197874 9.703552243965001
433 106.87827418384316 23.069297788398625
434 118.87708600344395 14.846240995185704
435 109.60021909060214 14.529144284980626
436 121.52909469585137 21.939193723457215
437 172.45768451664065 15.802382446974025
438 123.17721730993166 22.15853881623065
439 171.01286792728519 21.20428260424516
440 54.98828552237584 10.011112211006019
441 73.25849593301915 10.394966123359534
442 80.96413960163824 13.30605697418961
443 170.69934749576663 21.55457638152594
444 126.23591093564193 15.482818601386876
445 135.51925773599308 21.37725182181717
446 163.15406290666456 23.820316312568554
447 234.52280553146474 22.058403013007997
448 36.864940643251416 9.691631315009923
449 85.93305420862245 21.82514803523341
450 42.08601748936677 10.087406156318519
451 118.58959293347729 17.113601682441566
452 114.50786685925858 22.210990903632997
453 97.43553652066971 21.49335098053729
454 165.8120646474085 22.590076444404477
455 59.67388617464846 9.704366475110634
456 90.46744740789843 13.461029050605626
457 169.73315620395758 23.703491208808785
458 165.52715444538214 23.004924772041203
459 90.58315989162246 14.290725705879064
460 86.71789836870241 13.75905227448258
461 171.01465606662845 21.70104695876846
462 63.8765340531562 10.924255368965003
463 139.42526931741415 21.795013490235497
464 111.98738511385649 14.691268918769689
465 123.35624798842068 15.196716306465001
466 165.80222988102057 23.052608487861516
467 170.8224310872278 22.42270965572625
468 59.04052203625258 10.790740964668128
469 142.03356857278516 22.649681089179868
470 201.3598049705734 18.124496457832187
471 128.42090884102632 21.85813140656268
472 164.50553083393194 20.67080688263689
473 135.63274497964548 18.200790403144687
474 130.68913574197467 22.461330411689637
475 74.10631773195101 14.121448514716954
476 83.59987970973765 14.130985257881017
477 138.56076354959183 21.13572311188494
478 167.9924025532923 23.5985870340041
479 176.0670437810144 22.81224587754834
480 41.84708196460168 11.07207488800797
481 156.83709526035412 17.85031509186539
482 110.04486974062665 27.90919494416038
483 131.16358947734554 14.706990149690451
484 79.5977206509404 11.925613401191564
485 96.89636993393 25.401031492011924
486 76.55156517016984 11.765872953193517
487 169.06618022892093 27.053272245185767
488 118.4884637195084 22.68544387604511
489 169.3967290602777 28.4313316323928
490 66.0006958006748 11.858856199043126
491 143.82997216095046 25.065134277301183
492 123.9362553681259 17.838394162910312
493 173.60716009113406 19.969856260078288
494 100.70067896146556 15.62825393463883
495 71.99830012839469 12.264167783515783
496 132.82727355935745 16.729747770088046
497 132.8518306730049 22.350605132054035
498 243.3200537360138 27.4561996438674
499 182.48549651886754 25.815299917111002
500 51.79309509268832 12.249862668769689
501 254.58851051295068 27.42282104279319
502 114.40177059155837 24.185096738593945
503 182.6020970341882 25.75389098908224
504 62.590118026627 12.133037565009923
505 113.1327877042903 28.808032987373274
506 124.7494794670251 17.433082578437656
507 86.95870113359499 12.938892362373204
508 141.67141075112997 25.374805448310752
509 189.3638725259476 24.14607849117224
510 90.23459192897596 14.889156339423986
511 151.2410556791084 25.610839841621303
512 42.257455348901985 11.603748319404454
513 108.18224041262165 15.613948819892736
514 95.5859192437968 27.732765195625216
515 199.59584808319195 26.845848081367404
516 135.42412872293167 18.908893583076328
517 228.90486907923489 20.625507352607592
518 153.50049463884218 18.76822662140641
519 238.06689770980947 27.401363370674044
520 66.0586315153965 11.62282180573258
521 147.4854587976421 27.644550321357638
522 147.35141457428065 17.25903701569352
523 317.2511886592422 26.338987013831193
524 146.3606529233474 27.475273130195532
525 52.91242263785426 11.994754789131017
526 309.2598747249161 27.842437742011935
527 165.2961864468775 20.90445709015642
528 69.18978271473736 11.939918515937656
529 221.43640708887847 20.739948270576342
530 148.59331046186736 21.603023526924005
531 184.86617946598136 22.93578338410175
532 98.54622650131283 15.723621366279453
533 144.86815261817168 20.229732511298995
534 163.44307804081063 25.412952420967
535 197.87787192178013 27.56348800446311
536 173.8625659939966 27.129566190498267
537 255.93279393478505 28.183376310127173
538 347.38770675446284 30.19324493195335
539 87.94977736459778 12.602590543710587
540 58.86878631583282 12.411987302558751
541 131.20841140725784 32.17450332428734
542 149.28793067910846 31.325733182685784
543 128.35848652213423 29.98820495392601
544 79.19999821968966 15.072738645332187
545 162.91140460941415 30.44835281159203
546 81.6687889097791 14.228736875312658
547 172.37632417652225 30.74732503019178
548 255.42218081120916 28.970157621162336
549 136.33822555520703 25.03625106598653
550 70.52132516147051 13.52301788117203
551 209.38497434313206 24.681007383125202
552 128.52798045745917 17.032539365547034
553 165.7573288809212 28.78657531525413
554 293.20231628205113 31.735813138740472
555 172.36887359592532 20.146286008613448
556 330.8086227412733 29.380237577217027
557 371.7445487954783 31.266764973435684
558 160.76934729658416 19.516860959785316
559 175.3842725751123 22.253906247871278
560 65.03967612120167 13.320362088935704
561 113.3926033605259 18.248474118965
562 142.8794755933009 29.411231992500223
563 316.30030822541045 30.748220360751116
564 252.90957641388707 22.18714904572284
565 149.73533545576393 28.507625577705298
566 355.17445754791976 30.066883085029527
567 93.65542170192515 14.154827115791173
568 165.77540779087167 28.791343686836164
569 360.1931686380077 30.953800199287347
570 106.60574340803939 17.20181655670914
571 227.58237075592805 28.03940605159318
572 87.55161833749817 15.44228744293961
573 254.2261909480606 26.798164365547088
574 149.58547706582718 21.729385373847837
575 106.10524779083312 17.78594207550797
576 46.83880680997678 13.792430875556798
577 110.64389642061926 31.874095914619378
578 157.922495841714 21.4647407510451
579 111.29219627362625 27.630245206611544
580 135.95797035891522 19.173538205879062
581 280.901892089418 30.87750625397484
582 117.90816671178715 27.453815458076388
583 177.42275142643064 26.047145841377162
584 169.6857705113611 29.146587369697492
585 77.26417181215119 14.381324765937658
586 352.18230438019526 32.03860473419946
587 370.93869399811507 29.8490505641888
588 79.13037610040718 14.090454099433751
589 201.0883483883678 25.49878310944357
590 219.9804642991649 26.66703414704123
591 171.1058511731348 28.624450681465067
592 180.68401956531613 21.21916961457049
593 369.1982383706736 30.09464247325747
594 88.18238449083373 14.58159637238297
595 131.5361726932324 17.90753555084977
596 334.9589462258985 30.5508728006057
597 193.74505615203972 29.168045041816633
598 135.35212631204297 19.793426511543128
599 286.82700347687535 30.321140123403953
600 59.275298205192215 13.863956449287265
601 139.47462196328806 35.90575408722681
602 169.76087236377813 23.574745176093938
603 185.5420961377343 28.798496244209204
604 134.97637863137888 28.982078550117414
605 99.78953963043278 15.15380096222672
606 133.3522712705391 33.0661888101272
607 281.0358833308732 34.435954754114576
608 90.23967819199673 17.876541135566562
609 182.7582612034997 20.463382718818526
610 142.59575864980144 27.999794004218973
611 264.2606849649124 25.06724548126973
612 114.7830416359716 18.410598752754066
613 246.36260223175813 37.884628293769794
614 284.0294670100724 37.209903714912365
615 156.18747202531685 23.41738891388691
616 89.37803344712374 14.94637679840836
617 191.09717559601597 35.45966180159696
618 247.53767840032066 34.18437194611353
619 364.3774147012401 36.30715220677577
620 153.89672469879918 20.742332456367357
621 151.0229026792305 20.081912992256022
622 337.79374313141614 35.171424863594005
623 202.70414515873608 31.3734168985061
624 82.39332275376434 14.157211301582189
625 63.54093151990657 15.09419631745133
626 181.41438783887702 35.90098571564478
627 131.98804016091995 20.046150205390788
628 182.80832910511106 30.405437467353746
629 222.44179752864397 27.584945676582254
630 79.70994906943467 14.383708951728671
631 173.72547531101318 31.142150876777578
632 184.71886934522468 29.318248746650617
633 169.7608723637781 32.56550979401391
634 338.22289657379895 30.839359281318597
635 171.65123367282962 29.222881315009992
636 186.40010499927604 26.600276944892794
637 94.44713033026176 14.80669635971238
638 177.30466079499055 22.122776029365415
639 173.49003696415036 29.745018003242414
640 55.3201679815794 13.968860624091954
641 127.2797508237811 35.19526672150416
642 248.58663787799242 34.16291427399439
643 366.046344754951 34.38782482141896
644 137.65071983316125 20.546829221504073
645 177.4710311886987 23.94190978791035
646 183.20708417865842 24.1326446511916
647 361.48301315094716 34.25570656906583
648 89.52242388028877 15.311157224433751
649 250.13723564112462 29.294406888740465
650 87.33793568597838 15.320693967597812
651 185.15279115918946 23.190891263740422
652 225.77125422124348 35.836612699287365
653 364.70881652619124 37.455474851386974
654 193.7474403378307 33.75521850373072
655 194.175571986303 35.085594175117436
656 170.0675382611475 24.533187864082233
657 190.67660903900259 34.11999892975611
658 271.38224792267613 27.472888944404513
659 373.8927001931834 35.307405110894486
660 86.27160859094667 15.203868863838048
661 192.17162275287708 34.39739909919357
662 207.07095173396638 35.798465726631115
663 119.1000428631321 19.82203674103532
664 306.2505554194962 32.33901214386742
665 158.51258299062172 19.678985593574374
666 193.04444612745112 23.481761930244332
667 239.23594347600405 27.437126157539282
668 319.19859161334375 35.37408065583033
669 245.5651620225534 34.96161651398462
670 202.2630707873982 32.0290679910354
671 164.25310516330822 30.20755004669945
672 61.57300307524284 14.605438230293124
673 142.0054351804513 34.98892814229081
674 177.70468139621823 35.2167243936233
675 64.49335697708894 14.955913541572423
676 104.17900907059948 16.038333890693515
677 226.5690917947464 35.98681640412135
678 171.94478654834842 31.506931302802975
679 136.16870994546576 32.20788192536157
680 108.516943417899 18.913661954658362
681 248.19293212855138 33.266460416572514
682 190.34377288605504 23.653423307197457
683 354.5998687722851 34.31656206565679
684 129.7868305551154 19.97700881745133
685 308.6679964060233 34.04847335602564
686 93.47581303900199 15.5781860330275
687 249.18634287480774 33.51203155304712
688 183.0920472142419 25.10300826813497
689 211.521204811882 28.855716703193586
690 139.60885162332227 20.944988248603686
691 294.30619430329136 34.54587183237732
692 321.1245368953263 35.700714109199474
693 99.96652003681784 16.33635711457047
694 329.4443244912795 35.21434020783228
695 393.4234170908371 34.68981933380884
696 175.94329070832063 22.289669034736512
697 203.6516887116798 29.973899839179918
698 329.48008727814465 35.264408109443615
699 249.12514877283846 33.788597104804936
700 72.35965788980627 15.413677213447421
701 161.2946628992047 34.56531211651946
702 97.24837793607493 16.972934720771644
703 255.68126233383288 30.352985379951406
704 73.94802756047343 16.51755523468766
705 281.5484161355667 27.1963233926467
706 174.6907725331506 35.81753921295923
707 158.9565713668154 39.46772765900416
708 262.8731559749161 32.12920379425805
709 366.9880981424021 35.954292709705456
710 189.5304968694644 32.39861678864281
711 205.73137991738562 34.42994308258814
712 228.94540023768215 36.3611335733108
713 250.01994323517613 31.90509032990258
714 128.3844958216726 21.49335098053729
715 111.98975060183511 18.474971769111484
716 333.57284774737695 36.55186843659205
717 254.71202087189485 35.631572721260014
718 345.3015441873242 37.708198545234644
719 370.7026596048045 37.1115436553395
720 75.88399314868542 16.40311431671891
721 292.57677307086334 39.30798721100613
722 336.4705200174024 27.851974485175997
723 168.2427420613489 41.88529205109402
724 173.24893617603396 38.41630172516628
725 163.17359161164097 23.817932126777542
726 121.78376908716447 17.85031509186539
727 263.5692710855179 47.2663993814163
728 105.10700754002556 16.882335660713046
729 115.45399125399321 17.783557889716953
730 216.85837300583003 38.41391753937527
731 235.9664300279245 33.49295806671899
732 172.21479558918094 34.11999892975611
733 370.34026336457003 39.64654159333034
734 342.31177520539063 41.19387817169949
735 100.88988113388116 17.161285398261874
736 125.08153152446472 22.46371459748065
737 246.16836102768053 37.05493163849634
738 191.54649625475318 27.782833097236544
739 370.018398282783 39.650409698423694
740 226.96255238815422 28.302585599677954
741 142.49991531350784 23.195659635322453
742 216.34952163665875 30.941879270332265
743 361.83110427643544 38.56118740748703
744 199.1724128701859 24.709617612617386
745 395.1138048166672 36.09648895050807
746 333.40922546173834 39.29845046784206
747 346.0091142649097 38.068210599678
748 142.34232063272165 22.396957395332212
749 290.227873229555 39.33659744049831
750 75.99075169021651 16.972934720771644
751 177.980138505904 38.88360214020534
752 287.9046554544144 31.120693204658437
753 171.6852083203516 36.30868148590846
754 196.00859832550816 26.981746671455294
755 172.0639958378992 36.942874906318615
756 100.61825425269043 17.90515136505875
757 211.1839408853226 37.72556548642496
758 211.26064736472108 37.25520324494166
759 174.97054290558629 24.657165525215042
760 140.61974639871295 21.598255155341977
761 289.7333259561234 37.02574072937881
762 208.02973501992457 34.76372909333033
763 228.97242100998037 38.28517150666042
764 337.7127437586231 36.299144742744396
765 131.84828428769268 23.11221313263691
766 352.1131629922558 36.29437637116236
767 301.25950088458404 35.63395690705103
768 64.74554119099467 16.47225570465836
769 144.5769424417191 40.831481931465106
770 113.9867235817724 17.645275113838046
771 153.5728468892299 42.90572356964871
772 149.91335466149306 37.10261535431667
773 311.2362976052933 39.07091653340366
774 217.2238366260213 29.76647567536155
775 177.80057143952183 27.522956846015838
776 160.83054139855363 36.981021878974865
777 236.54022407496248 30.41020583893578
778 332.93245124763683 40.91492843415065
779 242.7076454141312 35.01645278717798
780 105.74156775824972 17.774021146552894
781 228.58816973332839 38.03960037018581
782 235.82926940705113 30.138408658759992
783 214.51941680695347 27.038967130439666
784 104.94793564917485 18.548881528632972
785 228.70618692998355 39.26507186676785
786 233.20156923894362 42.459880826728785
787 370.5429191568065 40.194315075807836
788 229.58754094406234 37.6414413430862
789 491.4950485208194 43.14652633454129
790 232.76764742497866 36.44219589020533
791 216.41332499150707 38.380538938301044
792 120.66753664864346 19.307052610175937
793 209.07911736594164 36.964332578437755
794 253.2839635209666 39.715682981269794
795 231.62443033818664 32.37477493073267
796 254.8428236639924 37.629520414131115
797 390.73935699249967 41.75646262325971
798 147.5733413693629 23.68918609406269
799 373.74249648834945 37.77018737580104
800 76.11605389901095 17.99336623932633
801 264.7256683345352 42.757904050605745
802 180.3881661548299 44.855987546699495
803 252.54764747584127 42.612468717353785
804 250.1153778071915 38.79777145172878
805 212.0994682290726 25.7634277322463
806 219.30686187531282 28.765117643134992
807 497.8059883096377 42.50518035675809
808 181.42252111408322 44.18126296784207
809 386.2737770059275 46.90638732697294
810 100.05183982833913 19.469177243965003
811 231.59661483729155 44.61995315338895
812 203.4496421792679 26.88876342560568
813 221.38673655156575 44.68432616974638
814 268.49499892975615 30.71061324860375
815 284.1749023433244 43.58283233429715
816 135.17829174441945 23.67249679352559
817 265.62682342316435 39.83250808502956
818 349.9125595071484 43.625747678535426
819 116.02054179779124 20.11529159333024
820 210.4438934323131 31.251823423164304
821 380.85929107453103 43.62138919165276
822 389.6367340082566 41.53004836823269
823 380.3943748452829 44.00755378170585
824 335.254648208086 44.076358793037386
825 103.49920218316271 21.128570554511892
826 315.25467147784576 42.943870542304964
827 395.36706161286094 45.048154576548484
828 183.85640334870152 25.210296628730674
829 380.5326576211618 43.83448360805413
830 400.8352546686569 41.91867065216824
831 452.0725364663762 41.27732467438503
832 92.65285982389233 19.13062286164078
833 189.52398443195423 24.423207577753374
834 493.1449610385153 45.49971771027372
835 416.5786294931808 44.74869918610379
836 174.17899322296907 30.28622817780295
837 259.31833496051195 29.456531522529524
838 352.5065536477734 44.038211820381136
839 386.98188018585904 42.92126070212557
840 98.70034708280342 19.619380948798984
841 336.17488097931647 36.3444442727737
842 216.37478065455238 44.78207778717801
843 212.30015236960384 42.476570127265894
844 229.97775268519194 43.842708585517855
845 138.95725364663767 21.319305417793146
846 368.4209938028025 34.584915159004154
847 155.21763822743816 20.627891538398607
848 246.10080909693497 35.12135696198268
849 509.55525588776266 43.94284438874051
850 135.6270229337471 25.260364530342
851 344.1070671060254 38.20172500397487
852 241.99047279322417 44.22894668366238
853 379.4597740152048 45.228557968068685
854 209.57128143280136 39.145862577217066
855 155.241405484932 25.668060300605678
856 347.4968461985035 45.03718566681668
857 380.90220641876925 45.20993643532413
858 146.80993949018773 20.86154174591814
859 305.1947708108597 44.84614747563542
860 247.93226114873346 35.04744720246119
861 230.00596555038558 33.29268646027368
862 347.1969718911816 43.92377090241238
863 386.6361732461618 44.865605508058856
864 78.74867001689282 19.18069076325211
865 412.02298354889604 46.23881530548856
866 228.60088539088034 48.985397336738565
867 220.248615262764 31.442558286445543
868 225.20056915070344 28.81041717316429
869 264.2487640359574 43.77595138336942
870 215.49693298126988 29.041683194892805
871 297.71230926471094 44.65571594025418
872 281.7686258948274 44.095432279365504
873 178.37016725513547 42.86042403961942
874 354.49734878327143 34.31073379303736
875 99.47827284661489 21.545803067939634
876 263.4816001887833 45.45203399445341
877 396.10139083649375 49.22143173004911
878 360.2551574685741 46.582138059394815
879 515.4966468789736 47.26163100983427
880 115.46948846163482 19.37619399811539
881 253.19329452301793 46.63135024471857
882 116.45634269696612 20.4443092324904
883 257.70417403961943 45.84657445439858
884 154.23985714358946 26.09721374298849
885 317.9602455134903 37.99191665436549
886 339.3816108682325 45.81204604889676
887 369.1124076821971 45.993571840410155
888 266.8570632913285 31.170761106269765
889 241.80927467310696 40.039932248847926
890 282.5884651179824 44.87744521881863
891 128.72760183141602 21.59110259796893
892 335.95917510933117 46.66320037628934
893 432.7630157449408 40.819561002510035
894 489.8357111605856 45.785820005195596
895 405.73177623695517 45.44249725128933
896 86.50108647333192 19.0877075174025
897 192.7637214639359 30.19562911774437
898 185.42378091785514 45.72621536042019
899 333.2971687295606 39.66084670807643
900 87.72476983057066 19.652759549873203
901 285.91147613312535 42.54571151520535
902 244.561419804536 34.24874496247095
903 247.09700139328106 34.31311797882837
904 234.85937309229638 42.536174772041285
905 207.957528250254 47.24255752350614
906 207.1939076011886 44.2313308694534
907 368.6975593545604 55.904304502265916
908 335.4042558664723 45.81443023468777
909 219.16320146802744 48.66114806916044
910 129.20116538980176 20.50868224884782
911 278.98064803864287 53.65914962760042
912 161.06597137238313 27.227317807929904
913 470.8408470132511 50.62810134674833
914 353.9585227945019 49.438392637031534
915 218.19828741860624 41.11043166901394
916 345.44108200020025 45.354282377021754
917 275.26186218219146 50.570880887763956
918 196.22794341828157 27.563488004463103
919 383.8323707559274 55.86785934439728
920 178.68748855377964 27.990257261054907
921 434.1959114053411 54.65260696198272
922 357.86381912018544 46.67750549103544
923 268.42347335602574 43.940460202949495
924 143.83897908504994 21.93442535187518
925 245.6401939370804 33.66223525788111
926 298.28540038849644 48.69452667023466
927 371.8519001001756 50.33961486603544
928 188.505565641182 31.46878433014672
929 407.740985868232 56.02687247585323
930 235.55508804108433 31.485473630683835
931 234.40352630402379 29.302148859506325
932 340.1564712503125 46.93261337067411
933 506.01712417389547 53.16249084259795
934 360.6485481240917 47.70270538117216
935 182.33767699982457 28.08800887848655
936 136.6181289670723 21.486198423164243
937 292.56335449005894 59.088407788856514
938 337.4113868709122 48.88049316193388
939 292.17479934649816 57.68052291657257
940 364.39887237335927 40.11622619416041
941 398.67154311920854 52.86208343292998
942 282.26326217608795 45.559322355049105
943 319.70015716339867 44.35054015900418
944 352.23958778328125 42.536174772041285
945 131.03412742593454 23.171817777412297
946 301.58899536090235 38.70717239167018
947 395.64124297882773 52.10107916364911
948 308.649523162416 47.50720214630888
949 308.0104942300491 50.96903991486357
950 164.13441848542024 28.333580014961164
951 530.2785987832704 46.594058988349886
952 187.51471185657587 29.761707303779524
953 397.3554725625679 51.348029666397935
954 295.4788040156876 41.56819534088894
955 432.2551841714545 47.94350814606475
956 361.2690954203051 52.18020629669951
957 259.6472854592972 37.08831023957057
958 363.0327339151073 48.60631179596708
959 454.9693222024602 51.0191078164749
960 85.64911710282607 21.912967679756036
961 393.2117576577828 43.96907043244168
962 296.22546386505894 39.17924117829127
963 375.4406957621019 50.287162778633096
964 226.4161764777131 54.924404142158494
965 193.4361337931181 47.39991378571317
966 198.87915801789097 31.351959226386967
967 404.10510253693315 59.46627807404327
968 171.4059164861635 23.65103912140644
969 280.04876327301787 37.89893340851589
970 206.22660936597666 49.858009336250284
971 396.15384292389615 59.65282169968954
972 137.4926483152168 23.0502243020705
973 582.5447196939148 51.555549619453416
974 357.4251918787401 52.32087325836943
975 135.34696856392665 22.89286803986347
976 234.32968648239245 44.7510833718948
977 392.19609451081016 53.064739225166306
978 342.21349048561285 52.78102111603545
979 335.92692565705084 52.211200711982706
980 122.45793437940016 22.52331924225604
981 288.44116439776747 50.74015807892607
982 289.60696410919957 51.10255431916044
983 388.6174316384958 52.93578765860626
984 334.51548766876965 37.11215209748073
985 289.0825103755508 47.264015195625284
986 370.48093032624007 40.848171232002215
987 433.19932174469665 40.98168563629909
988 190.11727523590855 30.395900724189683
989 366.17270660187484 48.09371185089872
990 152.66496997385747 23.41977309967793
991 331.046497342842 52.15549133292265
992 214.13794708039097 32.49398422028345
993 316.54236602730003 56.095039365547166
994 267.62674560504325 45.64515304352566
995 314.172727965883 46.470081327217066
996 464.2263768506899 50.17987441803739
997 374.30039596344704 50.2018712849899
998 345.7068557717969 51.71529006745145
999 289.1487907405412 35.49805831696314
1000 101.33394182628984 21.233474729316583
1001 161.27002631269758 24.022972104804886
1002 475.1490707376163 52.52352905060576
1003 403.12758636261674 49.753105161445596
1004 223.21262550318508 46.408092496650674
1005 306.1308692927872 45.678531644599886
1006 347.23988723541987 47.77661514069364
1007 351.3311500528027 48.150932309883096
1008 125.2913398740741 21.555339811103693
1009 274.08353042389683 56.629096982734666
1010 222.1949755347199 51.95609283234404
1011 267.96053161578527 53.141033170478806
1012 218.94684982086946 31.92177963043969
1013 374.9631996133494 56.680636087964665
1014 165.2133359906397 23.91091537262715
1015 292.52043914582066 33.04234695221704
1016 272.94109573321686 44.126426694648714
1017 258.7294410701308 48.713600156562784
1018 346.34581756378907 47.73369979645536
1019 374.8916740396189 48.89479827667997
1020 152.94543456818394 28.188144681709208
1021 333.661949155586 48.03621899632235
1022 303.670389556459 51.741516111152634
1023 268.64043426300816 35.4003066995315
1024 87.65026402460143 20.65888595368181
and here are the ratio plots showing the relative performance of the original unoptimised version of the code (pre-release-1
), the current version (pre-release-4
) and FFTW:
size,rel2,rel4,speedup
8,31.0035623439637,1.63676343916201,18.9419934500962
9,23.0236843367442,1.55019707211861,14.8521015494361
10,20.8464275202564,1.52725723153741,13.6495850795686
11,280.324183098903,1.56435086736902,179.195210579811
12,31.3217344925748,1.54102540511759,20.3252551116668
13,238.564872414651,1.5142891238375,157.542485552615
14,220.196265658982,1.40227308701968,157.028090817157
15,24.4004823296537,1.51632067661145,16.091901077404
16,41.613223688593,1.41958755282134,29.3136014090073
17,75.6522121597436,4.38124782902846,17.2672752402868
18,31.659967533097,5.19758925027499,6.09127924670499
19,428.745816685474,11.0372843127242,38.8452271897355
20,31.1467155085507,1.50172187974857,20.740668381129
21,243.187456369924,5.79700866099656,41.9505076827189
22,297.173923636788,4.89193999730343,60.7476632584616
23,338.913321074374,8.88142754852406,38.1597799703602
24,39.9146205525711,4.80993853354735,8.29836395500337
25,30.844757712075,1.45579836111016,21.1875205633241
26,254.636204069331,4.61884540213681,55.1298391480107
27,35.8707950145261,5.025285774866,7.13806072361777
28,256.327406474509,4.29205300130751,59.721398220484
29,136.255087213481,3.60365033698868,37.8102963583696
30,34.4694643926202,4.22661227826201,8.15534099730437
31,140.631775111143,3.70681317795991,37.9387275159471
32,55.796267061807,1.53996138286642,36.2322508100497
33,365.283997243452,4.70208669204362,77.6855088319718
34,99.4332853296993,6.87360486240698,14.4659588847649
35,296.647448889548,6.19788716426123,47.8626733639329
36,22.1364583157872,2.20197339103689,10.0530089990612
37,312.918980821529,4.27237236251994,73.242441030342
38,531.142250661184,13.1362383584803,40.4333597005946
39,357.94137972657,4.47059144754442,80.0657774092012
40,20.4687655988403,1.88201220199891,10.876000472845
41,279.270424648104,3.54659664218119,78.7432157710355
42,318.924524672781,4.14994140804612,76.8503680689162
43,281.747643338043,4.06448791039616,69.3193458928462
44,424.1869719843,4.88827996227309,86.7763252633039
45,40.0534922145836,4.13065578851163,9.69664243774129
46,427.682735934799,10.7107268012327,39.9303188169804
47,256.424329809441,6.64590987404611,38.5837808019095
48,30.1298650675711,2.21984675642496,13.5729482138194
49,371.29467467343,6.79095103147479,54.6749156270673
50,45.9285788055788,3.76573523012641,12.1964439873902
51,108.93295754923,6.5767137346704,16.5634330372279
52,418.450271063551,4.6358703902462,90.2635828525239
53,233.262880194168,4.26660400045692,54.6717905315767
54,30.8789814952158,3.32955411810945,9.274209218365
55,519.369414156701,4.90764204091986,105.82870751905
56,338.902214071608,4.36027235295829,77.7250104208914
57,481.308370331345,13.1161994235707,36.6957191476062
58,228.591352563704,5.72930040117016,39.8986501941871
59,211.712173908992,5.49540482226518,38.5253099191562
60,26.415368131313,2.14231319678089,12.3303017369288
61,217.957897546566,3.64562736745699,59.7861151395193
62,217.582717709118,5.42006629572176,40.1439218337353
63,399.561169721661,5.95303222745183,67.1189327481083
64,77.1386234280048,2.19715772781031,35.1083686217107
65,481.857605313242,4.69757132547056,102.575899742187
66,524.756015432184,5.18566481752392,101.193585373832
67,493.973069731807,4.36885772689544,113.066870246386
68,129.768483217381,6.72846159270372,19.2865012944564
69,451.222572680023,10.7982225457984,41.7867450653344
70,412.985101384841,4.4137334021936,93.5682026421418
71,446.168666714429,3.52618788072942,126.530032376532
72,43.3313245255458,3.42810248293288,12.6400318372262
73,422.209119515195,3.77233597095442,111.922459390163
74,438.762564712467,5.66676561614072,77.4273358797008
75,56.3774648955331,3.59735767593472,15.6719097666273
76,546.277651021967,13.5352193701864,40.359719047128
77,555.351526550351,5.33531469468432,104.089741342466
78,483.562604732599,4.90865287355765,98.5122837545706
79,421.277925273441,4.05189514945009,103.970589004658
80,32.5702339374315,2.29366377665251,14.2000908193119
81,60.8374213913291,6.02230511579752,10.1020157932122
82,391.400568530886,4.74294180424299,82.5227432014331
83,376.43862980617,6.43201931606345,58.5257306155852
84,258.660069203734,2.95991650669191,87.3876234748325
85,147.352980120585,6.68779503122347,22.033118454234
86,371.070479141964,5.09480975517009,72.8330393034619
87,242.132373957657,6.12549523669456,39.5286200709408
88,551.401191875935,5.69908677196007,96.7525524596098
89,502.646686053713,6.0849103185434,82.6054386573171
90,35.490493816823,2.886158536488,12.296792905912
91,478.318094027619,5.05503643457953,94.6220863524606
92,460.329737004008,10.8497727426219,42.427592533405
93,231.280967852096,5.72917887747017,40.3689556214769
94,349.468105493579,8.4761250732814,41.2297013637964
95,602.254428424729,13.1754544213742,45.7103344722372
96,48.3820658264393,2.21747325535186,21.8185566430934
97,361.023447620726,2.82363817519637,127.857545910824
98,448.542659597839,4.81597455498339,93.136426382009
99,516.505095013952,5.40387864511537,95.5804393351481
100,39.1023293337295,2.40981148522821,16.2263021706972
101,307.671136213038,2.7574790075825,111.576964091841
102,149.505035197283,6.89374551808903,21.6870545634423
103,406.730452669845,7.08064824241602,57.4425446293689
104,500.501671424073,5.31987717037946,94.0814337238492
105,425.162572970627,4.74143707007673,89.6695593945206
106,305.97788291228,5.20765860122859,58.7553651923523
107,383.150072000661,6.70958502449636,57.1048836257084
108,49.2275128714945,3.53973794321518,13.9071065884557
109,326.228891955307,4.42092542277739,73.7919916663869
110,565.622120091478,5.73825576447872,98.5703919983533
111,639.112844687001,6.10011551312085,104.770613492863
112,273.996433022369,3.16891395029057,86.4638287187461
113,409.337945427271,4.93010978201938,83.0281603302565
114,613.23874996535,10.395843600868,58.9888395314211
115,500.922741873498,10.6860811063151,46.8761875274812
116,296.500529084055,6.67424636799331,44.4245706160831
117,451.719074313888,4.95426533168229,91.1778122631355
118,259.845133913181,6.28971626447753,41.312695674479
119,154.671595437838,6.90173763511877,22.410529581827
120,46.499174900736,2.89426726052016,16.0659575344052
121,610.328310244978,6.26484536902882,97.4211292208783
122,259.930403508287,4.0919402715776,63.5225311849612
123,573.313354046854,5.10297348419401,112.348879691936
124,289.453788865766,6.31544279159588,45.8326990549181
125,71.0629719495507,3.50390856959131,20.2810577211606
126,297.680059140862,3.45310154210278,86.2065755991608
127,307.710885330496,4.40920991472868,69.7882140522746
128,56.4045482855623,1.97222531830717,28.5994443748325
129,549.339852550991,5.50354284542707,99.8156765523213
130,497.35505670896,5.27719651045514,94.2460747337349
131,695.928907841214,4.09163858870681,170.085625294967
132,395.531989644992,3.90619502086852,101.257614515378
133,617.28480992687,9.14001831552102,67.5364959475666
134,618.695555789857,5.20017639419773,118.975878679844
135,49.9844159596429,3.3877707853077,14.7543677324388
136,188.083940308365,7.09931909507802,26.4932365751476
137,719.295889668846,7.06490245547373,101.812571964324
138,502.525446836379,10.9852975303071,45.7452741220685
139,872.942812789777,11.3013142084304,77.2425929135383
140,332.551356100159,3.10424242223272,107.1280238033
141,491.668951166375,8.76619662786181,56.0869179689276
142,587.18482651983,4.46790832478531,131.422756206182
143,523.972874511054,5.8245516014578,89.9593497257215
144,67.7299881544339,3.50715038463533,19.3119714658248
145,312.101861576098,6.94831294503479,44.9176460595552
146,546.709253613293,4.69215341661894,116.515638997848
147,417.177229780238,7.30798337339484,57.0851366875022
148,662.169036336561,6.64018888432046,99.7214157416738
149,701.786347622189,9.14085381725311,76.7747041635855
150,65.1752883721421,3.00552919715258,21.6851290061959
151,700.753969942058,3.60450366623251,194.41066921552
152,503.801432706304,7.05263643530718,71.4344823141817
153,181.329392680331,6.85940760788887,26.4351388699787
154,541.043311835516,5.59613344161645,96.6816316087049
155,288.826578404247,6.46731080362966,44.6594554017952
156,386.526618980629,4.0998314722036,94.2786603793928
157,834.542331338152,5.7246650871687,145.780114405068
158,538.769792982785,4.89504689855652,110.064276021882
159,435.714709146841,5.55165816743913,78.4837063100064
160,63.7782579786892,2.64838201887133,24.0819706236602
161,544.872701910037,10.136592540599,53.7530437104697
162,65.8962179141201,4.82006775077625,13.6712223398743
163,602.396566061772,5.16534007927235,116.622827697074
164,578.970676300861,5.47963781865232,105.658566398327
165,545.964865486633,5.66641733122414,96.3509804472319
166,481.151118987848,7.69587309600932,62.520666984146
167,698.678541154153,8.96732763145295,77.9137966035203
168,344.667718728519,3.7016554210472,93.1117782516376
169,517.912065422364,6.31928877926352,81.9573346801099
170,187.773527222397,7.21552902702464,26.0235287695635
171,684.342512136198,7.86167436305867,87.0479341337088
172,542.342627134465,5.94467846841586,91.2316166494012
173,691.446918204287,8.91819932223255,77.5321220372986
174,323.690545705247,7.36868947621973,43.9278309596113
175,416.771335598153,3.83723726543242,108.612344447037
176,426.574487709098,4.29366778390924,99.349672396106
177,396.512956199167,7.2122219567504,54.9779192289062
178,474.673162247135,5.37361420051765,88.3340605660543
179,682.272685691075,8.81262761066135,77.4198928893438
180,65.140155932268,3.37692441829449,19.2897879441338
181,563.065132198392,3.58883612910634,156.89351977701
182,457.635660262831,5.13712755194056,89.0839590093415
183,372.875240298742,4.30921614767945,86.5297138783672
184,447.231871511689,7.8256470523751,57.1495070654833
185,664.294696626511,6.76620023093984,98.1783976165657
186,299.688065640459,6.92426518817358,43.2808474973368
187,193.714881150811,6.51292217158049,29.7431592221532
188,478.597326529552,9.2877990222524,51.5296816159451
189,307.919880322086,5.03467648518066,61.1598145836052
190,654.515562164685,7.52033089433827,87.0328142951052
191,584.268659113577,7.89867100153976,73.9705019995997
192,84.3939794660343,2.68455674529526,31.4368394759905
193,592.160682445265,3.21003403885168,184.471776709601
194,505.150491642247,3.49133701210559,144.686831976039
195,536.307975198127,5.21042280876202,102.929837919536
196,347.849331181805,4.23182719058969,82.1983780328547
197,674.131604545726,5.94794616280849,113.338551845166
198,432.409036710015,4.4170346812402,97.8957757670591
199,672.32728119474,6.51295722558765,103.229187281217
200,74.1495001282507,3.23424301050514,22.9263849028678
201,747.263302135204,5.29427979332923,141.145411898471
202,424.436484409191,3.33771650651002,127.163731126161
203,351.113850141492,7.52822571037472,46.6396550328743
204,151.827104640608,5.65997089181679,26.8247147454629
205,588.799652391248,5.68794776880192,103.517063855752
206,407.659571435643,5.99498792044962,68.0000655289175
207,520.313314974387,8.64698656278165,60.1727909713563
208,402.793691683496,4.29423199691294,93.7987728592816
209,627.466437344979,6.96871266240051,90.0405093081906
210,354.025897583459,4.18606870316163,84.5724049669974
211,511.040444728673,4.45879525586792,114.614019124589
212,422.391924997952,5.9741714545898,70.7030134987905
213,736.175247364266,4.76409476756209,154.525735377213
214,408.079797739854,6.02592605943284,67.7206779032835
215,542.166398734392,5.95878458806846,90.9860711897516
216,90.6417415134905,4.50175902651671,20.1347386609509
217,328.04316595483,7.06015013331852,46.4640495967241
218,451.260037872095,5.11489310298884,88.2247250892506
219,670.902993282901,4.88991574817308,137.20134002995
220,463.914388694385,4.09764451062795,113.214893944837
221,213.42503126647,6.10715600497038,34.9467135099827
222,632.89136298718,7.0288072252617,90.0424983505812
223,466.967602378254,6.14180094716028,76.0310544733888
224,379.99709156789,3.05103298083667,124.547028483345
225,75.685162555707,2.94068723479471,25.7372364052141
226,448.964506679869,4.66111014943399,96.3213681475405
227,502.185119847148,6.64961260599658,75.5209588291324
228,569.731831319062,5.99081677322171,95.1008606815853
229,555.812350340781,7.34095773840578,75.7138741492722
230,457.060724940688,7.36705964477915,62.0411326878011
231,578.855477893771,5.65084857932878,102.436911866877
232,357.783442762585,7.71442618496528,46.3784906594702
233,562.08338002122,7.42265078376306,75.7254242986575
234,388.464908783067,4.25283916789152,91.3424875588843
235,492.16793745969,9.5725412942168,51.4145535999965
236,361.390406862752,7.2658677686901,49.7380930079744
237,662.478082979693,5.17616221098393,127.986345090558
238,190.842998544489,5.72694448036949,33.3237032764418
239,546.493120794215,7.34036374110265,74.4504141850771
240,83.1914014040263,3.49017300370652,23.835896190727
241,421.258869670249,3.49095589083705,120.671495957871
242,617.866795051413,5.60775813132937,110.180714036064
243,89.7270342015239,6.022580406774,14.8984369059817
244,343.105586126694,4.51919598698607,75.9218204111385
245,450.304106696642,7.20509118982626,62.498044068128
246,579.070826575427,5.90342471306688,98.0906600356381
247,677.300422052894,6.43369570582211,105.273928550892
248,335.336750312789,7.25838240683012,46.1999287881606
249,553.810902657188,7.61500681252114,72.7262517673094
250,78.8365200760403,3.20481517686718,24.5993967593182
251,523.399742696637,4.13845183049496,126.472353463164
252,377.449894087009,4.16071179335792,90.7176254528281
253,576.834639475515,7.57077885540754,76.1922452752007
254,417.632242312575,5.01418489408449,83.2901560541334
255,189.178267404063,5.93266087882364,31.8875916335158
256,110.734191742325,2.92178087703896,37.8995538688538
257,158.04862300712,3.03681720430436,52.0441674207797
258,549.7790952933,6.38726294390543,86.0742856715936
259,771.640801166783,7.04852836803097,109.475448047653
260,430.246987615493,4.65318810508936,92.4628400783791
261,346.359379184053,7.5015570030073,46.1716653016435
262,975.801001719577,4.80850358008868,202.932364605119
263,1315.66173593951,11.3951719718132,115.457821891051
264,576.222160143937,4.97484243894201,115.827218091048
265,412.358846415636,5.74353096634222,71.7953553018358
266,660.267723190285,6.1584546803647,107.213214590253
267,589.265515745625,5.66229249038105,104.068363961532
268,836.299919499441,5.56224407242757,150.352970601387
269,1319.61240409077,11.9865929919981,110.090699248044
270,76.9386078845709,4.20653083224705,18.2902755151023
271,1203.06911393861,4.65387893355974,258.508897870788
272,158.813219162244,5.11026919590893,31.0772707021743
273,531.625846529593,5.26292150619059,101.013447740815
274,940.392060345556,7.75933640221694,121.19490786311
275,675.192450291204,4.42969719369742,152.424064392453
276,527.43144793996,6.84242461376165,77.0825369239987
277,1319.80680856013,10.277829665352,128.412987131843
278,955.268634472655,10.4054136521036,91.8049648395796
279,325.468398428997,7.24227009104575,44.9401077752405
280,400.933471805248,4.00004185338329,100.232319185894
281,1325.77960338102,4.9118157113997,269.916397780165
282,489.345546650158,9.88271931591126,49.5152731761093
283,1293.72834674038,11.6748748761547,110.813037438436
284,806.928750634983,4.95971079636046,162.696734500553
285,695.647937109771,6.26837239860235,110.977442448199
286,538.657203479221,5.28855704057084,101.853340967478
287,727.55331718038,6.18238108794256,117.681732463779
288,109.277615313159,3.12552842019265,34.9629248632535
289,223.571813289553,7.16202842807971,31.2162700182827
290,382.752054496402,8.04802999151378,47.5584776522942
291,561.479960811569,3.69502056068951,151.955842082458
292,753.966911082262,5.22920425959736,144.183870748303
293,1103.35906346806,10.0535133817513,109.748604450145
294,391.558967307844,4.49421413598571,87.1251247626553
295,370.546474356103,7.39323907173502,50.1196391406757
296,809.916210213678,7.57621328307539,106.902509202448
297,661.862949786433,5.31042119312058,124.634737192569
298,940.101921882978,10.1240311473805,92.8584580783534
299,558.638305291894,6.51956331529195,85.6864606225359
300,101.182083440555,3.48332969097975,29.0475184426472
301,699.758177310983,6.52683236530832,107.212524873531
302,940.827322153705,4.11601585904305,228.577185893653
303,481.038853666049,3.65366157121042,131.659389981948
304,652.219475009659,5.61677966742443,116.119825527843
305,353.135312599842,4.65760211581875,75.8191240510817
306,169.682263138503,6.19098386593491,27.4079640349506
307,905.898978825545,7.12293211472156,127.18062789806
308,626.613220392914,5.2004177199461,120.492863100122
309,460.96160034408,6.4585405258265,71.3724096799858
310,384.06120650799,7.49156758033583,51.2658001665886
311,998.025430316007,9.63661686586908,103.565955169475
312,516.468589757692,4.64917193003444,111.08829648162
313,970.632427693536,4.93974712133624,196.494355652557
314,925.845936398627,5.42376894354759,170.701581508199
315,421.336899752695,4.44187646196928,94.8556096415832
316,738.784541906404,5.41990801224091,136.3094244843
317,1096.9846367387,10.4713583394471,104.760490585658
318,452.321710322474,6.24938953959902,72.3785431291097
319,409.605786037976,8.04094282777195,50.9400196980971
320,102.287460999453,3.1553270983591,32.4173874247925
321,472.127167529192,6.6827192830028,70.648960031888
322,540.059488113134,6.81509876050291,79.2445578695151
323,622.636523327125,7.3981404559442,84.1612195706361
324,122.590179913927,4.77130175112903,25.69323557977
325,591.747207938315,4.86244721240049,121.697405049294
326,779.196514122214,5.73035315165429,135.977049494283
327,489.872495455394,5.31042542758677,92.2473165540728
328,726.483441465791,6.260795659741,116.036919418617
329,613.982257355448,10.1444447007423,60.5239887906846
330,634.252608881127,5.08976508685377,124.613336383505
331,901.985690895881,5.35929574098963,168.303026085536
332,659.708705342733,8.47152254002399,77.8736882568531
333,752.99016577877,7.37556219190177,102.092579004423
334,775.2938758776,8.439562837187,91.8642222155685
335,846.09125333199,5.66677773537919,149.307294699352
336,494.73393126766,4.48801000722954,110.234587371845
337,979.880865238625,4.89417494128454,200.213698323877
338,589.055704975882,5.96841402841206,98.6955164591028
339,487.216641835129,4.8447674233329,100.565537880857
340,198.591406523838,4.8919755521036,40.5953391239745
341,409.586472040896,7.6046274951649,53.8601624210147
342,609.139831752487,6.97285929075553,87.3586869248991
343,562.070367675752,7.63484495279803,73.6190939240703
344,695.329369579615,6.65550991577794,104.474244404809
345,523.856265790079,6.29700440466113,83.1913449833883
346,784.839938486554,8.33031953761429,94.2148659415439
347,933.457314250363,8.6596843402609,107.793457310043
348,427.456671139366,8.04349991061574,53.143118777836
349,950.074101468039,9.06205946665952,104.840859295118
350,494.113338108466,3.67127606204135,134.588990247092
351,574.903207511164,5.18790579653571,110.81604602286
352,638.893719088529,3.99126801207957,160.07286836036
353,968.134511027729,4.54486547218059,213.017198628594
354,381.673866122807,7.67087849845298,49.7562132159675
355,881.13644748383,5.13737973341,171.514759120008
356,618.922357178502,5.759699430787,107.45740548026
357,198.607151994154,6.93913375175162,28.6213177464724
358,781.547601605375,8.19999261521092,95.3107689579635
359,959.608426416626,9.21417720260633,104.144776610677
360,109.74304887471,3.92845032477607,27.9354554091161
361,751.637490270261,12.5526274776228,59.8788971958406
362,783.005691204304,4.12612995944813,189.767578554174
363,621.147351103776,5.64206009594483,110.092296172141
364,559.608020154014,4.91569044220145,113.841184007388
365,796.609802272414,5.23242323333337,152.24490962382
366,374.941868803699,4.79466543030541,78.1997981410386
367,840.824731314084,8.14210721436228,103.268688212667
368,513.812163735259,6.22078883514413,82.5959821739157
369,674.572209462169,6.05809363313358,111.35057500147
370,801.260072138537,7.50088789903639,106.822029994805
371,540.62672699841,6.37256112045472,84.8366483709509
372,390.405340803122,7.50701596131035,52.0053963938791
373,900.6418234615,8.41484726114433,107.030085693917
374,216.000750046229,5.89991755227253,36.6108082244353
375,149.916344129949,3.61062727399239,41.5208584973052
376,620.918231999434,10.388553715758,59.7694586742703
377,476.307825573929,7.499623852073,63.5108953420739
378,451.850366440746,4.38554348954287,103.031783293944
379,923.209964002848,5.21444984086693,177.048392865422
380,611.099378902982,5.26843223057695,115.992643002273
381,494.253379913041,5.66352712573916,87.2695352100984
382,816.215954231671,8.39721498147583,97.2007928857645
383,976.669541180908,9.31226500243959,104.879912773643
384,152.641402495647,3.27024948100198,46.6757669047556
385,675.67591693434,5.68500767169711,118.852243647481
386,787.938100127915,3.6216683404359,217.562191250532
387,682.843173868159,6.55022539967252,104.247278864983
388,638.418893624038,3.90189887420475,163.617488357936
389,851.727837497005,7.68751198640299,110.793692289972
390,556.42205513466,4.8951011702227,113.669163472947
391,523.733161797886,7.55597048284735,69.3138178592415
392,485.807529115287,4.73185551754285,102.667447751565
393,1060.21601867565,5.04470765402127,210.164015714672
394,831.571970107557,5.71959916498163,145.389903404224
395,819.216150348264,5.68045751329172,144.216579110288
396,628.65757491269,5.20114735299737,120.869018361958
397,914.596515194875,5.98180911388771,152.896305746617
398,824.264738519433,6.26564016193443,131.553156136715
399,675.839046197227,7.62157315116603,88.6744813429797
400,156.70936927354,3.88529322160385,40.3339877675565
401,764.497773429644,3.69670689941294,206.805081990961
402,1022.25299664792,6.00090330364025,170.349853167574
403,434.342447179386,7.91709319763724,54.8613533195504
404,545.515295272911,3.56100842792824,153.191239592288
405,127.87834857968,4.09236981845031,31.2479942558331
406,386.998118999461,7.20549559266565,53.7087441137817
407,848.052117943561,7.78404031166005,108.947549600074
408,188.738867582271,6.03136126523553,31.2929137026086
409,793.507881855528,7.40771034664317,107.119183219024
410,694.736328914123,6.26191990096739,110.946217757719
411,1087.24836606028,8.24293518263694,131.900632720063
412,579.225239637382,7.21479800927357,80.2829460911965
413,449.896522495776,7.6428707652119,58.8648606415763
414,481.608974102715,7.48183955351905,64.3703958976496
415,683.947511404036,8.28230090815064,82.5794086678208
416,560.362439390747,4.385113859198,127.787432067552
417,1091.42931780311,10.6817246382677,102.177256460349
418,647.620097051185,6.12578913312164,105.720272601216
419,855.774804797403,7.96583532876967,107.430642170904
420,492.476568201643,4.12690418266153,119.33317237427
421,831.529675540752,4.60107126012412,180.725233001134
422,686.189350142989,4.74973722682027,144.468907936274
423,608.430142029746,10.0212454416168,60.7140245765283
424,525.783827437897,6.4352465154793,81.7037585387258
425,194.488630624881,4.76692187317194,40.7996262157045
426,987.814650377906,5.26808378865114,187.509289906497
427,430.692521759793,4.90697868970632,87.7714269807781
428,584.783053385078,6.87788933597804,85.0236205933257
429,564.437273863266,5.37346053625163,105.041671015416
430,658.774352361513,6.64776873465221,99.0970622861142
431,832.205734282893,7.76679292150943,107.149211095634
432,149.789830487304,4.39301345151843,34.0972847318574
433,731.316001578312,4.33591500465811,168.664745686355
434,390.388355988516,7.55148478089593,51.6969003203366
435,391.03670022181,7.28894748168562,53.6478965178907
436,599.785054162366,5.44015864785354,110.251390260285
437,562.314650063609,9.75145692036191,57.6646807401103
438,892.027263732429,5.39193778184675,165.437232368603
439,801.909006806316,7.6494306247857,104.832509259966
440,623.218920572504,4.95274485041268,125.83303590141
441,472.803385486657,6.2468634342978,75.6865249992142
442,284.931102399285,5.53547412978692,51.4736580315755
443,783.428649920795,7.4389234792412,105.314788101666
444,898.468106781393,7.59887774523923,118.236947205039
445,766.860466046303,5.9303393239855,129.311397569563
446,663.550758009001,6.80319979533089,97.5350978909076
447,1065.54188317982,10.4203881944936,102.255488307324
448,492.35403534789,3.41197830930699,144.301631110865
449,809.662746988605,3.75296723897789,215.739359134164
450,147.451863291934,3.77201910358311,39.0909640812441
451,756.091147986454,6.48606312284935,116.571660445744
452,595.314067501916,5.05358569899699,117.800330885864
453,1058.42510903773,4.28480204239349,247.018438323581
454,689.063268549226,7.18845734468546,95.856904410605
455,600.91663917742,5.38563997518527,111.577573314627
456,674.309731096883,6.32016922269077,106.691720955187
457,750.736157491946,7.07683134652074,106.083658170127
458,661.960722893855,7.15171158820548,92.5597620554991
459,189.440774013471,6.18505572427405,30.6287901772633
460,551.772203810844,5.87048330374678,93.9909331585495
461,811.473144674888,7.67510370221381,105.727971394162
462,633.814173185857,5.3768884124323,117.877501738807
463,810.681501264912,6.22173760985763,130.298246583154
464,391.236056774239,7.10092172193747,55.096517338807
465,380.206821299068,7.59001904750258,50.092999624839
466,652.613015692748,7.14519568000966,91.3359192553093
467,785.84208906336,7.44283914121426,105.583645454838
468,542.084077773696,4.98983936016438,108.637581021414
469,1038.32601978614,6.04511716199487,171.762761905427
470,608.355664929834,10.5179224269714,57.8399079432086
471,944.885671612098,5.37734930652325,175.715881143496
472,460.496214669603,7.7817148366845,59.1767013227901
473,684.112195487549,6.72618717152283,101.708765760181
474,864.527279588159,5.61700257565444,153.912565989421
475,771.698207770463,4.89274396985433,157.722989906099
476,266.473262695194,5.59528602106853,47.6246007249342
477,508.686673582495,6.66875243606987,76.2791359341992
478,655.437300677378,7.11601773744166,92.1073168815654
479,785.891318553757,7.65488244831632,102.665367346903
480,148.789986940107,3.6644691199445,40.6034222338761
481,971.222766756003,8.45121392330103,114.921096018907
482,554.715783997261,3.93865496146435,140.838887748376
483,694.26212830919,8.3271621796523,83.3731964540864
484,646.186870301022,6.15318145645042,105.016709628093
485,724.487746474418,3.95313883803676,183.268986027877
486,168.409212113894,6.05040286501071,27.8343799365493
487,687.822122514261,6.40240280383259,107.43187262484
488,424.012366373052,5.15227920531328,82.2960770324307
489,797.536079428995,5.88174935839609,135.595046784938
490,490.169254027678,5.18911498669616,94.4610507349273
491,688.379490586977,5.4474714998763,126.366790648213
492,819.768972919284,6.55951902427568,124.973945480676
493,450.75665922744,8.52571617394483,52.8702398755642
494,783.673478318083,5.96671007489725,131.340968218835
495,627.791370972855,5.68945453177952,110.342980590882
496,430.758887795221,7.75092293223226,55.5751736356334
497,1002.35062404769,5.56733103805451,180.041498735444
498,763.618257042825,9.19690076867435,83.0299550087342
499,728.733682452732,7.29388618937792,99.910207471291
500,177.537235352487,4.07819888015864,43.5332460651307
501,837.000531352696,9.15817598478558,91.3938029519414
502,664.732949242104,4.71177311937794,141.079150544894
503,740.496411688008,7.19768602553609,102.879787901398
504,488.327379387896,5.07508243179089,96.2205808380487
505,583.733087791724,3.90810878918681,149.364595327241
506,600.164605506714,6.97950896971682,85.9895170434984
507,603.505737174284,6.37222807505323,94.7087470922395
508,542.214598197208,5.86485263473014,92.4515298110568
509,773.371742646601,8.00944694940629,96.5574461672323
510,253.479245875098,5.72767688872876,44.2551580334268
511,909.571298558846,5.66144030976592,160.660759239984
512,191.836498116332,3.41849022981593,56.1173164817446
513,732.721224371974,6.49534214975691,112.807178971996
514,203.959819983088,3.39939344217644,59.9988861108421
515,575.122412159116,6.68889039425816,85.9817366199945
516,759.434785432332,6.68422936568084,113.615907516809
517,634.635289856642,10.4440483881157,60.7652575201386
518,867.797608652772,7.73574526316025,112.180220409462
519,824.111659460536,8.45866153984936,97.4281398514513
520,565.18307163623,5.07383283710044,111.391740678476
521,1498.25459791786,5.1053144610599,293.469601010005
522,520.869833196188,7.98315104212318,65.2461453438389
523,1551.39940316362,11.4915239227771,135.003800504528
524,1072.27513227212,5.07979408329489,211.086338282557
525,496.446050570955,4.00397399200315,123.988330484282
526,1240.86848905617,10.8721457114637,114.132805242647
527,410.132072917508,7.53036068935294,54.4638019128868
528,626.510905262879,5.29300621632866,118.365798122459
529,653.465571117176,10.125320099112,64.5377691490944
530,576.432722269123,6.51537698966783,88.4726583255639
531,448.798779660079,7.60795714905048,58.9907081319579
532,795.055841530106,5.82506541467312,136.488740457298
533,896.232103806864,6.75377440891398,132.700923889902
534,777.302708365584,6.03950554321713,128.703037492624
535,587.686567138934,6.74832058178945,87.0863439304921
536,1104.59737008177,6.76169203839275,163.361088291198
537,804.759193188106,8.86661404093707,90.7628537198688
538,1261.51856059997,12.1362520416372,103.946305356212
539,726.098874970669,6.51323702143681,111.480493122066
540,170.061347621322,4.38975987523666,38.7404670083814
541,1385.49522203287,4.25694660421781,325.4669017131
542,1260.903377379,5.20984537887143,242.023186041682
543,807.992663068268,4.45424897331231,181.39818135658
544,234.526631063782,4.86455413703312,48.2113312869448
545,637.435073965456,5.92229152647252,107.633180689626
546,573.25506277815,5.84569260626933,98.0645239818719
547,1400.76348486921,5.65668974648638,247.629540888165
548,1098.34495754179,9.07992034043053,120.964162279172
549,428.21642409432,5.33398573261271,80.2807591846649
550,681.193482488049,5.02804345553242,135.478837546347
551,535.035858791042,9.11232453363817,58.7156281381283
552,650.750667048643,7.13475830249594,91.2085090283986
553,939.947384473715,6.175071206677,152.216444639111
554,1256.47507964087,10.1193420432122,124.165689258788
555,916.245660731232,8.36210132460401,109.571222012742
556,1098.05693562896,11.7022828109106,93.83271224698
557,1386.65889150992,12.1485188844183,114.142218051655
558,524.108548674871,8.10595905419229,64.6571917241316
559,799.13154953098,7.66683827226862,104.232216873738
560,540.523334755136,4.86288239635866,111.152869985069
561,266.762661882614,6.19213292409693,43.0809004187388
562,1286.22687536678,4.95733070258012,259.45956655612
563,1445.42082564087,10.4238848667998,138.664312212863
564,726.396844237268,11.0754427353918,65.5862579575308
565,631.584554468889,5.32108897282594,118.694605125812
566,1267.22683419539,12.2029700056616,103.845771448054
567,475.20381990524,6.35243159686285,74.8066016389566
568,1010.87332174474,6.19610715982229,163.146520173117
569,1457.87210841751,12.1397222044667,120.091060064052
570,796.256209167334,5.93431937412018,134.178186067949
571,1503.79701598318,8.01483185400126,187.626770389754
572,606.443552778871,5.75869147669246,105.309262570042
573,857.184394886198,9.19244588509806,93.2487833598005
574,823.574399805857,6.62117625592903,124.384908054422
575,677.600101062989,5.58337601390817,121.36028441844
576,190.063066625296,3.41498854289748,55.6555503006271
577,1366.23434339652,3.54288523291388,385.627603938173
578,268.390001282356,7.24559323510984,37.0418256412496
579,837.415055509825,3.93295667782809,212.922522190677
580,471.591710735791,6.86735717433307,68.6714989134944
581,814.489698512036,9.08201233993726,89.6816331035355
582,753.861098194257,4.15695175592509,181.349494162338
583,568.744369625575,6.8518663117772,83.0057598537787
584,918.716211917827,5.74715222150621,159.855903673463
585,566.157202838182,5.24149848322371,108.01437883656
586,1197.6385242667,11.3385518035309,105.625351898446
587,1395.09553251849,12.141802479261,114.900199941599
588,518.813606204685,5.43046019815844,95.5376869129108
589,559.276920152753,8.05582390081343,69.4251670640765
590,489.068368362511,8.30349736251222,58.8990815569482
591,823.379947292871,5.97074967726284,137.902272210201
592,929.258609434265,8.1490647899677,114.032546480459
593,1388.42007465563,11.9994148660581,115.707314911077
594,748.249202000277,5.79291247609112,129.166322655227
595,259.623375175152,7.06607898619062,36.7422124324592
596,1064.27412315248,11.3037770256769,94.15208038295
597,825.71323631448,6.75568775547254,122.22489644309
598,671.715852046562,6.61682577736479,101.516327412519
599,1373.58178467059,9.23673888179233,148.708521724937
600,190.421089625676,4.12524307814985,46.1599682778159
601,1204.97073943955,3.92096689320629,307.31469360972
602,790.150694961337,6.98083584193909,113.188551178114
603,1083.42056362943,6.16423421712628,175.75914955005
604,1039.35736325981,4.55245060760721,228.307224579885
605,699.591073980053,6.16711781316787,113.438902121556
606,635.103150356197,3.85319027131681,164.825276105339
607,1228.3312046364,8.03902083004798,152.796121642724
608,787.869923321634,4.90163511777552,160.736143019799
609,485.792080496192,8.42377666750146,57.6691547830744
610,469.539917738897,5.12249147893378,91.6624106979732
611,718.89456610235,10.1904367662041,70.5460013732201
612,246.301311426979,6.09738381576806,40.3945887070509
613,1129.94223342683,6.49283720353658,174.029041235065
614,1022.32627451459,7.72433535716289,132.351358044879
615,809.708663900494,6.62869021240698,122.152135332098
616,697.438607682519,5.69139420256608,122.542664039694
617,1197.24461561026,5.31408303695375,225.296557709902
618,687.922357513737,7.36097643222815,93.4553131432191
619,1163.18878738785,9.70072078618196,119.907459767807
620,483.72726147557,7.08880357825006,68.2382091894529
621,691.039050680961,7.22048424514535,95.705360917528
622,1060.45527363896,9.08749401737319,116.69391711418
623,829.186845320996,6.33828711351301,130.821912998103
624,623.082918985416,5.33161498261693,116.865700358503
625,185.411126618826,3.81559096755941,48.5930300693162
626,1067.68237278954,4.90030081145065,217.880986060011
627,831.675785680329,6.34222706713891,131.133082571185
628,1021.10184670803,5.98943841207216,170.48373761552
629,948.257944091708,8.05010876625382,117.794426339532
630,520.458170342153,5.15399995549776,100.981407612738
631,1350.03416524413,5.44963260611805,247.729390735168
632,947.673534642313,6.15639005074959,153.933315925447
633,691.70739238333,5.02498672569535,137.653576047529
634,1244.82851268428,11.1589404794215,111.554364411201
635,588.117229793036,5.69057024161472,103.349436844163
636,628.303008148543,6.89327321713906,91.14726608926
637,645.333590863415,5.83011120441156,110.689756719409
638,535.273235513216,7.65741146898357,69.9026345497231
639,1059.02619837487,5.65982246304366,187.112971350229
640,186.796588030041,3.70786820561626,50.3784324769427
641,1201.03553075966,3.5621432773882,337.166541947821
642,645.032398916213,7.31694930751662,88.1559201528946
643,1221.92995714235,10.4010289754838,117.481641482064
644,646.63197032523,6.48432544442444,99.7223189778726
645,781.860362175706,6.90715255815611,113.195756947987
646,750.451534889,7.42888455233244,101.018063964042
647,1221.86908164988,10.2931552116762,118.706952000863
648,214.863474871702,5.66276105583057,37.9432352439578
649,539.598795341489,8.25469062061373,65.3687485263221
650,614.168829833405,5.39044485645549,113.936575957713
651,458.988628167404,7.85561113018796,58.4281248856093
652,821.63896723908,6.07965901432378,135.145567424634
653,1144.02233995556,9.73663504045274,117.496684963799
654,673.971344075337,5.873867651051,114.740641790719
655,1124.27020602021,5.39474178920782,208.401115372993
656,843.02688487024,6.83398311674054,123.358057880646
657,999.578910478347,5.62860868515041,177.58898626502
658,713.000242574187,9.86808012856652,72.2531873763535
659,1200.67169165136,10.4499873207634,114.896952005455
660,696.580426121324,5.23526858447892,133.055337062646
661,1191.60035759226,5.33187107362349,223.486341124609
662,1021.86302922336,5.59044654185529,182.78737155838
663,286.589693627204,5.57850375732662,51.3739357530784
664,822.662777572089,8.78430387105964,93.6514480427294
665,771.799655220865,7.48640591545508,103.093482231246
666,939.315204610539,7.66330929802286,122.573051416949
667,568.141191887983,8.36625070058969,67.908697960478
668,842.787494589472,8.78271287912091,95.9598140334321
669,635.985171234099,6.65626678128311,95.5468270926938
670,1116.34581408648,6.14091469767802,181.788197531647
671,510.454282219038,5.19131763515576,98.3284626550736
672,518.090150540254,3.81315418809747,135.869184665399
673,1162.49495229153,3.85066477092853,301.894613384173
674,1018.37232837763,4.76328443633686,213.796245424469
675,184.206884561851,3.89340782201769,47.3125069303396
676,763.245320149297,5.87802488351934,129.847242104957
677,1149.83369661697,6.06299618408454,189.647768480426
678,658.714126920765,5.17101143773156,127.385935005731
679,749.831736234241,4.00015722235298,187.450566203789
680,246.728031639254,5.29077755438329,46.6336051937858
681,685.366494014556,7.22825818953031,94.817655380278
682,475.116569315815,7.53328465364152,63.0689786939284
683,1184.62454049305,9.79011517254363,121.002104634615
684,769.438729510337,6.05539241846815,127.066699618616
685,1139.44056987355,8.68321930125727,131.223286011971
686,559.3982097035,5.39236364361152,103.738962480068
687,668.919915625723,7.27436331032118,91.9558024654378
688,795.073583813363,6.86413996442611,115.830036673769
689,615.794581609889,6.94210245288475,88.7043350035837
690,661.073178425251,6.18806546772236,106.830346555556
691,1164.93615155336,7.99345343188465,145.736278003023
692,831.058130277,8.69201430219884,95.611684631808
693,736.425280665839,5.53389328736211,133.075439374234
694,1023.31218976872,8.89024464143303,115.105065275658
695,1158.03252705707,10.9696431454976,105.567019063184
696,514.28870148554,7.31974807924209,70.2604373699691
697,856.225019097665,6.44187303693948,132.915537792787
698,1016.98754809235,8.81858563417589,115.323203774432
699,665.588439830414,7.19693966669527,92.4821480594741
700,526.391986344262,4.21949681545386,124.752312744107
701,1165.37448932601,4.38045756830065,266.039442490959
702,678.216658066484,5.40339211433159,125.516831596883
703,912.726735088656,8.19770964779994,111.339236726152
704,792.667262489475,4.24658509609169,186.659926635875
705,721.328206250743,9.83528745803807,73.3408361807691
706,1006.81905594603,4.6348105131083,217.22982052848
707,632.417690190266,3.91199587812754,161.66113408406
708,483.788170621505,8.28952396106429,58.3613935967671
709,1180.0578098656,10.0809700432916,117.057962160187
710,1094.1049679917,5.70314973767663,191.842230752549
711,983.484023434481,6.03141293589908,163.060303429196
712,839.796815738163,6.27347932910202,133.864602349518
713,498.163250755859,7.79280763067061,63.9260295346197
714,249.375683499672,5.76549542786498,43.2531231044646
715,648.673776919271,5.90636315191071,109.826260295123
716,810.439719305663,8.80286145124323,92.0654861824735
717,664.880282833152,7.28110754270968,91.3158168497145
718,1040.49619508955,9.17530187152301,113.401848752126
719,1142.49809814831,9.81760167974898,116.372423267586
720,183.427577741298,4.40541149021632,41.6368773152428
721,647.524237020807,7.25837308482294,89.2106577401983
722,767.783152354092,12.0808790347792,63.5535833231793
723,558.192381813456,4.05721166371335,137.580296045628
724,818.244915678415,4.60383692718187,177.731081404589
725,513.802585053426,6.46345236829243,79.4935207651522
726,748.129377662551,6.36606732587643,117.518294948217
727,930.797796519286,5.69582745852376,163.417484693353
728,684.647624065403,5.77955485165742,118.46026928338
729,219.996001887404,6.22927586112627,35.3164648334627
730,1011.95963548093,5.95706375069698,169.875575926567
731,794.028616515608,7.01042329901881,113.264004561143
732,467.282532768426,5.1528992886352,90.6834204578819
733,1069.25759805572,9.13085642517322,117.103757661531
734,931.874988870851,8.5458002977408,109.044788832382
735,544.254437821785,5.51656772847817,98.658162939282
736,641.717463267959,5.37048520959107,119.489662148576
737,1165.98758881702,6.71601966563961,173.612890799356
738,817.687504453665,6.57516837356925,124.359933920566
739,1072.7956761926,9.22215383286713,116.32810465265
740,953.010948098821,8.3579434240636,114.024575155053
741,849.048333348047,5.89507782431695,144.026653871431
742,638.561325896524,6.64361530426113,96.1165414690641
743,1101.80914542846,9.15332777371353,120.37252163007
744,470.074441260341,7.62859769479656,61.6200329427487
745,1160.7361991702,10.8239375151478,107.237888018642
746,963.431883446816,8.28802997043873,116.243774079381
747,866.168298826463,8.84608304235113,97.915460964998
748,283.192328350644,5.91012647281937,47.9164582438369
749,671.166116811921,7.0807393923008,94.7875750859733
750,243.898551471721,4.19171819214378,58.1858179132465
751,1039.24436450975,4.22355202194928,246.05932615697
752,698.067699980212,9.45936138067153,73.7964934299461
753,619.866164920823,4.39815783894736,140.937680642489
754,579.504392641967,6.92500055170117,83.6829381189881
755,1154.57758197929,4.60267613414812,250.849190411913
756,520.387945916268,5.36259542193208,97.0403144320701
757,1101.42467261315,5.37904101902734,204.762274300766
758,1068.15167862711,5.69988994821451,187.398649505805
759,736.558970969195,6.68514753929943,110.178416652624
760,841.498250114011,5.98737345871683,140.545475560557
761,1088.83706609367,7.20782438773424,151.06320680434
762,614.669904182212,5.45141118139912,112.75427292653
763,703.795711843656,5.68953453700622,123.700050903283
764,898.560993838497,9.29212766591708,96.7013181635848
765,250.019721989229,5.5636315514103,44.9382241938455
766,1076.33731223984,9.43700971799439,114.054911926973
767,578.379875701866,8.36706241482018,69.1257991188651
768,261.407844067136,3.60221544480678,72.5686311861222
769,1058.46047755996,3.51520480954299,301.109191329757
770,828.635444204477,5.64472671726314,146.798150860037
771,258.596043228279,3.65510906985955,70.7492001704386
772,830.785979683635,4.02040738188502,206.642238154013
773,1081.6329280676,7.83627784137471,138.028914997971
774,737.43211989366,6.83458862814405,107.897074720342
775,504.162201253966,6.48153149782499,77.7844250889081
776,750.254809125945,3.95000320655516,189.937772172152
777,988.268425641431,7.91180514339074,124.910612398865
778,953.815990154617,8.26735842704149,115.371312199893
779,868.741963483235,6.62289603331585,131.172520165364
780,715.504137445214,5.18499617711808,137.995113786739
781,1148.47685489369,6.03083766717465,190.434052162398
782,657.222686080398,7.62297873178148,86.2159936692891
783,494.965452359725,7.73470287206196,63.9928204802228
784,557.261352455066,5.48394851631976,101.616809639387
785,1102.54097434532,6.07368414528363,181.527545386349
786,1166.32732004847,5.54559146119544,210.316127361652
787,1074.62700041157,8.8998722055267,120.746340576019
788,854.61724157712,6.13633141588185,139.271689166792
789,1351.62926970938,11.219692212782,120.469371536729
790,1047.1671153504,6.23921949354871,167.83623599605
791,694.924970297679,5.53485607606488,125.554298205302
792,828.658324291027,6.1987878440561,133.68070421794
793,583.586339299211,5.57504510726259,104.678317048767
794,956.992678411413,6.25472340166733,153.003197256701
795,630.877350374125,6.8770409745273,91.7367444386193
796,840.838421331531,6.78928080801114,123.84793693308
797,1063.22014224949,9.52246292402638,111.653902013822
798,796.297391599454,5.65434238678711,140.829355056428
799,715.927689486895,9.86975411949112,72.5375405323479
800,261.285513892916,4.05362467622819,64.4572536340578
801,840.624134476516,6.48458391043287,129.634244245658
802,873.391146435482,3.97840066613087,219.533229488644
803,1031.80263140242,5.98427091837876,172.419104261067
804,1154.10913902807,6.51883044910028,177.042361822336
805,694.861207698147,7.94807907594487,87.4250496325796
806,564.497626576878,7.17964930696825,78.6246796245329
807,1383.46235940519,11.5619749634335,119.6562320694
808,673.43442131044,4.14958579815937,162.28955227511
809,948.197174728681,8.43882313873835,112.361304312208
810,208.623502843133,4.96579818612887,42.0120784259594
811,1057.66977184788,5.15522384859885,205.164664602363
812,593.651575758216,7.22807711349676,82.1313284898012
813,1396.12970397736,5.20764747205385,268.09220698396
814,977.665387314612,8.41429764093197,116.190967925675
815,944.894761745995,6.46839564012012,146.078690036413
816,252.951492564745,5.51978130692761,45.8263613174815
817,784.156766770674,6.99570660005625,112.091145555528
818,869.600167578196,7.87243636560573,110.461377798801
819,710.005098724058,5.50309249180486,129.01929229454
820,867.109088620376,6.72263215338102,128.983569059967
821,996.9140740984,8.47642794943843,117.610163154215
822,1126.36882497793,8.88531494012666,126.767462106624
823,1003.32995882055,8.46871277992595,118.474906977459
824,651.138598600569,7.56538358905936,86.068153839841
825,844.515428048511,4.99906689654685,168.934612303722
826,576.106357758339,8.31997517305508,69.2437592391028
827,992.109951666725,8.69421125713478,114.111553345631
828,644.278867143651,6.8390019653782,94.2065626542077
829,995.569189170372,8.40461371746591,118.455079868983
830,888.341440629926,9.27021884347079,95.8274508541515
831,1359.79569761804,10.5044294025864,129.449744055897
832,717.403415146655,4.50788710920317,159.144050808643
833,282.673947745812,7.18068756064488,39.3658609093453
834,1172.80276287497,11.7091856344188,100.16091635165
835,917.107055683623,9.11941039624942,100.566485752281
836,816.923640135252,6.3934086393777,127.77591519862
837,464.807691998318,8.59350796187048,54.0882366154401
838,871.791737168063,7.90450888893931,110.29043668835
839,1022.18824326786,8.74245131163486,116.922383303123
840,517.664181967137,4.56942708146627,113.288640509616
841,614.596857512926,8.87431988711801,69.2556573721301
842,866.811056971428,4.84157421287707,179.034962361205
843,1385.64909866304,4.94427040509522,280.253502566342
844,721.138910002951,5.16607141981822,139.59135509364
845,766.459058456285,6.28742039651727,121.903580501924
846,704.343411540687,10.5172162374966,66.970517258124
847,853.05006857076,6.86250901488793,124.305857627305
848,627.915550526086,6.8619150165845,91.5073341783574
849,1361.37466659606,11.6567072987945,116.788955208376
850,264.582605698173,5.22141664542672,50.6725710023377
851,938.370400044133,8.7910250297975,106.741864215321
852,1126.48315768714,6.02621798200202,186.930370101366
853,979.827315102371,8.22642997111633,119.107233458818
854,505.472876614513,5.23536674086463,96.5496595814476
855,791.750397920969,5.79928212229199,136.525587344258
856,676.154932193,7.80009581582238,86.6854649171655
857,980.277431315768,8.26757531265417,118.568914614588
858,734.001552531788,6.46964545506599,113.453133966875
859,976.72574024949,6.61205773000456,147.718876654275
860,846.300973131295,7.44076212734995,113.738479828639
861,838.113161688194,6.7662433894219,123.866836212021
862,854.539016707292,7.63843565109149,111.873563611835
863,961.92479533997,8.21724556847167,117.061707274604
864,265.61340634876,3.7675920348921,70.4995137182804
865,894.324214970059,8.85877921888969,100.953437586872
866,814.037656409623,4.79656317905701,169.712693447657
867,354.813887078032,6.74212255100211,52.6264369112209
868,537.911300179912,7.30644314516087,73.6214994755931
869,1027.66604448814,6.11944653115932,167.934475651583
870,563.239265660982,7.16282295996165,78.6336991447849
871,1155.46921480469,6.74651209655846,171.269123699358
872,679.536842775566,6.54903469382497,103.761374697907
873,796.368567195073,4.09809608674832,194.326475108826
874,677.264357933236,10.1142345854229,66.9615038303876
875,547.431218112839,4.37188267386351,125.216356190333
876,1031.71986009956,5.94382843533884,173.578337821042
877,930.584545334349,8.11978348096504,114.607064032667
878,843.986776560976,7.50751451531843,112.418933701546
879,1293.52419141863,11.1188728178447,116.335910357987
880,782.904081094442,5.31759710225515,147.228920514196
881,934.64249263278,5.17238453228517,180.698570804026
882,623.226757624836,5.00169119192411,124.603205937847
883,970.418087129436,5.34674534314898,181.496971493672
884,303.442999442797,5.10890753980062,59.3948896273506
885,577.747766711815,7.9388103494478,72.7751062540499
886,846.511407749841,6.85323718340145,123.519934462518
887,926.231749745451,7.50618241684804,123.395848689538
888,993.086757584895,8.07749727783695,122.944858218613
889,658.641755700138,5.72367481631878,115.073231243376
890,872.453537277444,6.33804050887301,137.653512320731
891,797.358096929358,5.58361874545927,142.803105526821
892,666.490000569727,6.89938929096423,96.6013037476512
893,721.157101755568,10.0881652009048,71.4854572059238
894,1122.95075245574,10.9739659186592,102.328616726098
895,872.8020371521,8.4384510216238,103.431546253633
896,540.599731505117,3.93771639218296,137.287625025078
897,706.755078699019,5.98862192111668,118.016312936187
898,830.819157805731,3.67774353356128,225.904593461747
899,566.615005602821,7.93713998203914,71.3878055426776
900,271.187799297243,3.92609539932955,69.0731558238634
901,640.227831174316,6.19045180704092,103.42182624637
902,868.025803785126,6.41593790326442,135.292114243106
903,819.601359106328,6.81449205634646,120.273287037296
904,643.576442058412,5.06626012589972,127.03185901733
905,909.228848969586,4.40907620394749,206.217540117711
906,1100.01551637581,4.38446410339901,250.889388174722
907,807.99126506455,6.5042272373228,124.225559099182
908,711.79127060755,7.3585357114343,96.7300151172074
909,669.293105264384,4.21228556515497,158.890724503803
910,750.572267105405,5.68648946584241,131.992202151071
911,805.286978853394,4.93314934893751,163.239934956933
912,796.653528995929,5.59249094734205,142.450571041971
913,906.049765633183,9.57374609770754,94.6390009079246
914,860.082070314086,7.4264781870869,115.812912749086
915,528.897388614536,5.10146066915519,103.675677009997
916,725.916567325999,7.6165850238381,95.307354287263
917,1171.23104351,5.23507908183863,223.727478649405
918,271.115300648325,6.90657062855633,39.2546916884271
919,818.176466723655,6.80818727139773,120.17537622106
920,706.895049202311,6.03838191700707,117.066965772957
921,1129.85449184923,8.05363614390336,140.291226430006
922,830.569449354848,7.26352222623394,114.348028888113
923,1161.48155942179,6.02872257370251,192.65798769514
924,799.323463012984,6.17711733171301,129.400725304228
925,1026.06950758535,7.05544322910433,145.429489582273
926,867.636345570733,6.28542853165981,138.039330365533
927,677.359690770258,7.20771292456925,93.9770628851369
928,574.472527508353,6.05826381636739,94.8246139358146
929,813.483449106188,7.30120749106197,111.417659353202
930,531.893023362667,7.16985955006981,74.1845805553455
931,817.296013892808,7.58390641472478,107.767154445097
932,713.33088051632,7.42628177136628,96.0549171816682
933,1128.85728471138,9.27830227151485,121.666362193983
934,865.10116525594,7.54645816325339,114.636713878366
935,322.616153216964,6.0544173650657,53.2860775470281
936,720.972783584823,5.94554949433137,121.262598902291
937,778.06898147789,4.95602360965658,156.994607524036
938,1225.72719274588,7.27546359227065,168.474101643237
939,1168.23272198486,5.36011300850278,217.949270870163
940,765.901421943323,9.68520758686671,79.0795050156589
941,873.780025960545,7.54826679507052,115.759027824928
942,1112.44187725866,5.96549467070427,186.479401737079
943,882.998832097523,7.15128047545791,123.474227465674
944,575.434546744269,8.37017594281979,68.7482020300774
945,561.337326365201,5.50821831486128,101.909055574413
946,860.873094722788,7.76963546177053,110.799676375887
947,916.186682340258,7.82892276574291,117.025893568554
948,1053.07552206902,6.86382589509963,153.423985130633
949,1059.71160884098,6.08183818173075,174.241993485497
950,885.428522146107,5.57082744036225,158.940216983014
951,1346.16794720647,11.5902924741034,116.146158538645
952,276.925778486357,6.41786145411041,43.1492297654691
953,906.203977861731,7.84972926133348,115.443978727464
954,612.51743960058,6.76534728208795,90.5374719228815
955,910.89966686315,9.03533872521194,100.815220609428
956,697.293608862074,7.17228861535023,97.2205172237098
957,574.775710556546,7.45623254088008,77.0866127639178
958,856.841283734152,7.5473979729973,113.528037980734
959,1216.39447043105,9.17099860735247,132.634898609172
960,265.643639706113,3.80760425408198,69.7666096525991
961,574.173781708331,8.79751696155629,65.2654361699303
962,1030.97988591845,7.71773367834711,133.585833469606
963,655.361295957022,6.99537557792581,93.6849335188007
964,591.623032423643,4.09745863896031,144.387798524249
965,921.532980372998,4.19253766643819,219.803148758803
966,679.377025302583,6.21081358300074,109.38615629393
967,758.56647143844,6.7541568458606,112.311053585221
968,836.087844217789,6.84253110434275,122.189849263111
969,861.816646050012,7.54126557854249,114.280108169401
970,837.305406645717,4.35981566855886,192.050643949011
971,773.056494583846,6.6839984607787,115.657790635365
972,269.738705701556,5.71159260778726,47.2265310613698
973,1200.69158015954,11.6970528933106,102.64906819787
974,780.18977261685,6.80017251913039,114.730879315489
975,733.226488871681,5.62803285758601,130.281131511762
976,555.196730673397,5.30130803373895,104.728253317856
977,857.108003346016,7.38134769535594,116.118090993773
978,952.428525591511,6.50987729759852,146.305142485997
979,895.483515207574,6.55316117369628,136.649090640705
980,691.721941873944,5.03912244230137,137.270318352898
981,726.616137700927,5.79639551291027,125.356548924679
982,764.194888551527,5.26784395151202,145.067867534721
983,915.523888569179,7.25925208793643,126.118211281106
984,892.514888148552,8.5138339334884,104.831136609081
985,1005.63589199243,6.16271684835684,163.1806095814
986,568.845855194287,9.01718229882504,63.0846573067963
987,745.562092716827,10.5046803032647,70.9742772928671
988,1041.59114555383,5.50326221462461,189.267947797555
989,881.607367727917,7.34930171027716,119.957977299406
990,794.837361604731,5.85799270066536,135.684252647575
991,865.27837268516,5.94047899888039,145.658013915753
992,557.587178042882,6.1900366855673,90.0781701896781
993,1162.79627857404,5.62961439304765,206.54989798414
994,1185.59999212125,5.53102262783689,214.354572724814
995,942.413740908592,6.3137889802588,149.262787187728
996,934.298073132544,8.82010989166804,105.9281669512
997,870.93256880831,6.77095092972731,128.627806913288
998,812.641234560375,6.40692310560812,126.83798777748
999,1002.54718922372,7.14543610266103,140.305948415151
1000,291.449573656779,3.99018792068546,73.0415658234743
1001,776.653452684421,5.67712107032245,136.804102478003
1002,951.175605458871,8.38602789497823,113.42385422167
1003,593.159494315019,7.46548345115731,79.453594425029
1004,728.070226435854,4.76308964253058,152.856712990402
1005,1206.14720083557,5.78413280950817,208.526885629745
1006,878.910059385352,6.64649023509853,132.23671867357
1007,682.884348313215,6.82699019290724,100.027146519514
1008,559.048888273261,4.80850368562756,116.262547524761
1009,772.817533157271,4.3348413456067,178.280465544722
1010,730.999061202589,3.8148273381136,191.62048407781
1011,1131.82282383852,4.60962537080109,245.534665573446
1012,709.310865376529,5.85491570662902,121.147920980901
1013,806.677018536328,6.21137133728591,129.871001866201
1014,812.985332707849,6.03211400319479,134.776188294397
1015,613.07278843776,7.79899655181658,78.6091882929427
1016,668.043216728699,5.60852060576386,119.112197972876
1017,741.805247009802,5.05568094758426,146.727068954827
1018,846.833273326224,6.67139133984688,126.935032017723
1019,909.122842257941,7.05661884635465,128.832640964813
1020,295.142025029424,4.92560907112068,59.9199044763561
1021,930.461123973853,6.3584680673454,146.334166361916
1022,1030.02961536967,5.49102839930514,187.584099091532
1023,559.605990143784,6.94169606381837,80.6151673883523
1024,319.068029697597,3.61210863075487,88.3328997862718
The pre-release-4
tab is the one to look at: for most input sizes we’re within a factor of 4-8 of the performance of the vector-fftw
package. To be exact, the execution times for our code are between 1.40 and 13.54 slower than vector-fftw
, with a median of 6.12 and quartiles of 4.98 (25%) and 7.50 (75%). To my mind, that’s pretty amazing: FFTW is an immensely clever piece of software and I really didn’t expect to get that close to it. To be sure, we’ve done quite a bit of work to get to this point, but it’s still significantly less than the investment of time that’s gone into the development of FFTW. I have a feeling that we’ve eaten most of the low-hanging fruit, and getting that last factor of five or so speed-up to become competitive with FFTW would be pretty hard.
I’ve also done benchmarking measurements with this optimised code for larger input sizes: a selection of about 100 input lengths between $2^{10}$ and $2^{18}$. The results are shown below: they are similar to those for smaller input sizes, except that there is a longer tail to larger ratios: the maximum here is 15.22—the median is 5.99 and the quartiles are very similar to those for the smaller input sizes.
Size FFT FFTW
1024 87.49394674086957 20.55630031973121
2048 181.76302257925252 42.040198482573054
3478 1853.3776694908738 185.09373012930132
4096 390.79889599233843 85.48960033804164
8192 1010.2127486839914 177.04471889883263
8657 4708.614199794836 461.3350326195357
9086 3996.2647849693935 421.82430569082476
9415 6228.613703884183 778.119414485992
16384 2492.0199805870634 691.6926795616749
16856 5834.0738708153385 1007.6545173302316
19529 12992.324679531164 2444.8989326134306
21248 11021.344512142237 2074.8566085472694
23940 5932.366698421538 1743.7408858910205
24536 15700.454562343673 2414.4195014610873
24892 19178.597777523133 2179.910987056791
32768 7220.911830104882 2469.6110183373075
33571 29878.780692257034 4232.5590545311625
34780 18574.447482265557 3609.1516906395605
35958 18349.516242183774 3696.982710994785
40560 12912.015765346594 3462.7817565575288
42283 58961.57011333845 5712.201445735994
47665 62793.82452312847 6190.686076320708
50629 79750.49480739965 7187.00870815664
53443 58903.643935359934 6701.130717433986
54766 52524.26370922472 7452.642768062646
58940 22296.769469417668 7018.902152217919
59602 36258.537619747265 7731.134741939597
61202 48808.75334087757 8651.556819118548
65536 20226.907580532166 6319.017260707914
69202 50523.447840847046 9465.596526302385
74816 52708.96658245469 9562.048762477922
75673 63984.76108852763 10680.599063076072
75751 64004.59513012309 10679.452269710591
77841 39791.10225979244 9158.537238277482
81656 66113.01407162088 11950.569003261626
84755 44277.13140789421 11546.24685589224
88199 69382.6864654197 13635.709136165688
90725 55190.458148159014 11444.983332790433
93660 57280.29474560164 12409.379332698883
96173 40183.734744228466 12950.794547237463
99036 56893.52020565413 12472.44343105704
100779 97239.72544018176 13037.111609615393
101709 60115.625708736385 13058.013766445227
106188 126711.16337124267 14746.949523128584
106209 96156.72811809923 14851.078837551191
107943 72885.19367519753 15714.075415767747
108551 100098.40950313954 17052.57400814446
109616 47534.053176082656 12279.069274105135
110169 84087.73168865577 14926.893561519699
113756 134987.54724804324 16488.289683498468
116014 68652.34360042948 16784.331648983087
118128 89945.02052608869 15719.864218868333
121263 95224.32312313463 19073.588698543637
121809 115526.07282940303 17266.30911175164
122061 63832.17796627422 17255.163043178643
123091 162360.06960216924 21242.50158611688
124041 150720.79881969854 20417.518466152284
129699 123027.34121624388 20322.377532161805
130879 104332.14411083609 18590.02813640985
131072 62110.156863368946 13977.713435329508
133646 90496.5613776817 19275.166838802426
134256 105349.81474224478 18415.689318813413
135216 72718.66783443824 17970.90992275628
135518 143011.14067379397 21178.917735256284
137148 121270.22489849485 18165.948241390317
141628 124246.3181907312 21401.333659328553
144408 72285.35398785012 19518.00092998895
145198 92906.57743755722 20470.599978603455
146904 73992.79817882912 19883.439391292664
147366 101851.801722683 20557.763426937192
152342 76302.57114712134 22209.9851066247
155398 267659.1442519795 25328.59548870478
156978 99721.5102607384 17671.720832027517
161247 106458.11065975577 26277.75654140864
162423 194756.10718075177 25739.190428890328
164114 89873.88595882794 24654.161780513863
171892 100253.61522976308 22691.40943828974
174477 94842.68411938097 24811.680167354683
175813 94590.00334087753 25121.812670864205
178006 454508.38789287984 29861.605017818554
178025 128048.97770229737 24939.82538525019
182054 247542.43597332353 30033.895819820507
191258 233205.59725109462 29777.14285198604
192971 274799.59711376537 33996.438830532185
194666 222909.6673423422 32729.911654628864
199696 95961.14143673326 26793.114989437203
199942 176959.82202831662 33223.25453106319
202646 198171.88247982404 31819.317191280472
209466 118132.82951656735 27772.071211971383
212612 118961.6726333276 31378.276198543652
216113 412601.07730838243 41592.48565646518
218624 98954.9205205092 26820.80482455596
220362 133916.99289294562 32758.80311938631
222030 181025.3379246841 30516.612281526195
230270 257068.13072177314 34406.480540956145
234516 323926.16247149877 39456.29333468785
235846 123777.90187808362 34379.61553546298
237494 338569.7886845725 39272.682418550154
239491 265270.29012652783 36486.801852906836
241869 155717.2963521131 38900.701751435896
246308 269440.89149447833 40395.154704774526
248269 214511.25835391408 37460.25537463536
248329 333294.25071689056 41736.941089357024
254882 308638.6058232443 39243.81708117833
255579 307024.3499180929 39959.3660733353
256148 410313.2150075096 40429.47744342198
258840 193172.57856341713 33525.90536090243
259688 156256.30830737433 32994.611015046714
262144 204532.68741580367 26947.984447206105
size,rel4
1024,4.25630806030244
2048,4.32355291221089
3478,10.0131844995298
4096,4.57130334505071
8192,5.70597504950854
8657,10.2064960752245
9086,9.4737660468016
9415,8.00470157655514
16384,3.60278495670397
16856,5.78975608254369
19529,5.31405388837209
21248,5.31185840348695
23940,3.40209187409757
24536,6.50278650948708
24892,8.79788114808171
32768,2.92390654904287
33571,7.05927083528116
34780,5.14648567707446
35958,4.9633762656267
40560,3.72879859982365
42283,10.3220397028105
47665,10.1432739035685
50629,11.096479501533
53443,8.79010519554758
54766,7.04773666789864
58940,3.17667478273252
59602,4.68993735461021
61202,5.64161507129192
65536,3.20095779866032
69202,5.33758730371147
74816,5.51230890907898
75673,5.99074646568557
75751,5.9932469862387
77841,4.34470060278712
81656,5.53220637892446
84755,3.83476396793811
88199,5.08830789602262
90725,4.82224015041033
93660,4.61588716163002
96173,3.10280072760478
99036,4.56153764257501
100779,7.4586862759128
101709,4.60373428792162
106188,8.59236435118419
106209,6.47473016404474
107943,4.63821075989386
108551,5.86998827598295
109616,3.87114463767424
110169,5.63330416620823
113756,8.18687382616398
116014,4.09026376719557
118128,5.72174283910983
121263,4.99247019678082
121809,6.69083775123513
122061,3.69930888549376
123091,7.64317088286251
124041,7.38193522731767
129699,6.05378681807988
130879,5.61226391618496
131072,4.44351339371301
133646,4.69498200116769
134256,5.72065551923814
135216,4.04646554609657
135518,6.75252354541824
137148,6.67568922288273
141628,5.80554091480995
144408,3.70352241744109
145198,4.53853709879858
146904,3.72132792132693
147366,4.95442036215014
152342,3.43550753324738
155398,10.5674688662204
156978,5.64299941180641
161247,4.0512632991328
162423,7.56652031146063
164114,3.64538396230783
171892,4.41813081300247
174477,3.82250147832261
175813,3.76525390823335
178006,15.2204942641788
178025,5.13431733078723
182054,8.24210210551376
191258,7.83169823949515
192971,8.08318772691474
194666,6.81057956081641
199696,3.58155972064333
199942,5.32638432104423
202646,6.22803692764751
209466,4.25365571818227
212612,3.79121121506506
216113,9.92008702524484
218624,3.68948363659507
220362,4.08796964910159
222030,5.93202601437746
230270,7.47150323660013
234516,8.20974640784922
235846,3.60032827448013
237494,8.62099983587196
239491,7.27030807457284
241869,4.00294311776433
246308,6.6701289662998
248269,5.72636935356189
248329,7.98559362564021
254882,7.86464286042323
255579,7.68341392990638
256148,10.1488626851958
258840,5.76188999175226
259688,4.73581301613515
262144,7.58990668918132
This shows that we’re pretty successful at maintaining good $O(N \log N)$ scaling for larger input sizes, which is nice.
In the next and last article, we’ll wrap-up with some comments on what we’ve done, the lessons learned, and things left to do.