Skip to content

Instantly share code, notes, and snippets.

@srajangarg
Last active June 16, 2016 05:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save srajangarg/5af29bc2df02b965fd3f2501198b4bf0 to your computer and use it in GitHub Desktop.
Save srajangarg/5af29bc2df02b965fd3f2501198b4bf0 to your computer and use it in GitHub Desktop.
`testmul.cpp` requires only minimal changes for benchmarking `UIntPolyPiranha` too.
0.25 1 2 0.920732
0.25 2 2 0.870588
0.25 3 2 0.995726
0.25 4 2 1.051118
0.25 5 2 1.310433
0.25 6 2 1.345603
0.25 7 2 1.327754
0.25 8 2 1.548291
0.25 9 2 1.546229
0.25 10 2 1.686339
0.25 11 2 1.694931
0.25 12 2 1.908684
0.25 13 2 1.863636
0.25 14 2 1.902102
0.25 15 2 1.853870
0.25 16 2 2.085769
0.25 17 2 1.963293
0.25 18 2 2.061780
0.25 19 2 2.026522
0.25 20 2 2.188081
0.25 21 2 2.116117
0.25 22 2 2.180701
0.25 23 2 2.196732
0.25 24 2 2.377039
0.25 25 2 2.311661
0.25 26 2 2.321388
0.25 27 2 2.251122
0.25 28 2 2.361890
0.25 29 2 2.346661
0.25 30 2 2.422895
0.25 31 2 2.328839
0.25 32 2 2.662723
0.25 33 2 2.637931
0.25 34 2 2.600683
0.25 35 2 2.563493
0.25 36 2 2.648052
0.25 37 2 2.675465
0.25 38 2 2.639657
0.25 39 2 2.559473
0.25 40 2 2.676273
0.25 1 5 0.905405
0.25 2 5 0.701961
0.25 3 5 0.946058
0.25 4 5 0.853279
0.25 5 5 1.042153
0.25 6 5 0.950896
0.25 7 5 0.843320
0.25 8 5 0.826772
0.25 9 5 0.858082
0.25 10 5 0.818190
0.25 11 5 0.782269
0.25 12 5 0.724627
0.25 13 5 0.692902
0.25 14 5 0.655985
0.25 15 5 0.604409
0.25 16 5 0.666917
0.25 17 5 0.693396
0.25 18 5 0.704729
0.25 19 5 0.680645
0.25 20 5 0.636111
0.25 21 5 0.611391
0.25 22 5 0.597241
0.25 23 5 0.615393
0.25 24 5 0.623202
0.25 25 5 0.621141
0.25 26 5 0.615499
0.25 27 5 0.621549
0.25 28 5 0.593440
0.25 29 5 0.571707
0.25 30 5 0.563221
0.25 31 5 0.550122
0.25 32 5 0.693476
0.25 33 5 0.736488
0.25 34 5 0.720427
0.25 35 5 0.693704
0.25 36 5 0.648308
0.25 37 5 0.632498
0.25 38 5 0.656813
0.25 39 5 0.653280
0.25 40 5 0.653163
0.25 1 10 1.042253
0.25 2 10 0.612245
0.25 3 10 0.940687
0.25 4 10 0.746147
0.25 5 10 0.918396
0.25 6 10 0.658402
0.25 7 10 0.477145
0.25 8 10 0.473863
0.25 9 10 0.565043
0.25 10 10 0.506559
0.25 11 10 0.438988
0.25 12 10 0.411351
0.25 13 10 0.553009
0.25 14 10 0.522201
0.25 15 10 0.488957
0.25 16 10 0.593715
0.25 17 10 0.634179
0.25 18 10 0.579105
0.25 19 10 0.597750
0.25 20 10 0.700422
0.25 21 10 0.691377
0.25 22 10 0.675060
0.25 23 10 0.675184
0.25 24 10 0.728630
0.25 25 10 0.723344
0.25 26 10 0.642841
0.25 27 10 0.544974
0.25 28 10 0.530345
0.25 29 10 0.540237
0.25 30 10 0.558128
0.25 31 10 0.509609
0.25 32 10 0.627531
0.25 33 10 0.712948
0.25 34 10 0.712930
0.25 35 10 0.658377
0.25 36 10 0.654298
0.25 37 10 0.649878
0.25 38 10 0.551976
0.25 39 10 0.578889
0.25 40 10 0.604872
0.25 1 20 0.597015
0.25 2 20 0.685289
0.25 3 20 0.973635
0.25 4 20 0.499084
0.25 5 20 0.656026
0.25 6 20 0.434861
0.25 7 20 0.579990
0.25 8 20 0.683478
0.25 9 20 0.748792
0.25 10 20 0.713116
0.25 11 20 0.648833
0.25 12 20 0.637408
0.25 13 20 0.648912
0.25 14 20 0.561185
0.25 15 20 0.568076
0.25 16 20 0.665309
0.25 17 20 0.693379
0.25 18 20 0.595938
0.25 19 20 0.562377
0.25 20 20 0.572110
0.25 21 20 0.556181
0.25 22 20 0.689937
0.25 23 20 0.721410
0.25 24 20 0.783006
0.25 25 20 0.910576
0.25 26 20 0.897748
0.25 27 20 0.881851
0.25 28 20 0.901413
0.25 29 20 0.874134
0.25 30 20 0.868446
0.25 31 20 0.972519
0.25 32 20 1.334940
0.25 33 20 1.169956
0.25 34 20 1.041919
0.25 35 20 0.948226
0.25 36 20 1.024567
0.25 37 20 1.147922
0.25 38 20 1.181192
0.25 39 20 1.095802
0.25 40 20 1.239237
0.50 1 2 0.935897
0.50 2 2 0.843931
0.50 3 2 0.991228
0.50 4 2 1.028391
0.50 5 2 1.087500
0.50 6 2 1.320713
0.50 7 2 1.321881
0.50 8 2 1.521667
0.50 9 2 1.511204
0.50 10 2 1.772941
0.50 11 2 1.642933
0.50 12 2 1.972073
0.50 13 2 1.895169
0.50 14 2 1.928222
0.50 15 2 1.799747
0.50 16 2 1.955898
0.50 17 2 2.051534
0.50 18 2 2.048345
0.50 19 2 2.068590
0.50 20 2 2.084526
0.50 21 2 2.106862
0.50 22 2 2.163623
0.50 23 2 2.128920
0.50 24 2 2.300739
0.50 25 2 2.241213
0.50 26 2 2.301763
0.50 27 2 2.268090
0.50 28 2 2.234951
0.50 29 2 2.241601
0.50 30 2 2.324255
0.50 31 2 2.297378
0.50 32 2 2.580574
0.50 33 2 2.546423
0.50 34 2 2.560201
0.50 35 2 2.462540
0.50 36 2 2.472971
0.50 37 2 2.513893
0.50 38 2 2.494442
0.50 39 2 2.487386
0.50 40 2 2.609219
0.50 1 5 0.413043
0.50 2 5 0.819820
0.50 3 5 0.795031
0.50 4 5 0.977320
0.50 5 5 0.985283
0.50 6 5 0.938299
0.50 7 5 0.952287
0.50 8 5 1.011650
0.50 9 5 1.073439
0.50 10 5 1.002507
0.50 11 5 0.986605
0.50 12 5 1.017213
0.50 13 5 0.972118
0.50 14 5 0.995708
0.50 15 5 0.933253
0.50 16 5 1.085100
0.50 17 5 1.074252
0.50 18 5 1.079681
0.50 19 5 1.031916
0.50 20 5 1.065061
0.50 21 5 1.006243
0.50 22 5 1.007861
0.50 23 5 0.973107
0.50 24 5 1.047924
0.50 25 5 1.005152
0.50 26 5 0.933297
0.50 27 5 0.790078
0.50 28 5 0.801304
0.50 29 5 0.778265
0.50 30 5 0.767626
0.50 31 5 0.751403
0.50 32 5 0.885705
0.50 33 5 0.954206
0.50 34 5 0.994928
0.50 35 5 0.980895
0.50 36 5 0.963505
0.50 37 5 0.954713
0.50 38 5 0.945958
0.50 39 5 0.787229
0.50 40 5 0.786202
0.50 1 10 0.435897
0.50 2 10 0.882943
0.50 3 10 0.937340
0.50 4 10 0.811914
0.50 5 10 0.921072
0.50 6 10 0.768929
0.50 7 10 0.783609
0.50 8 10 0.847435
0.50 9 10 0.873542
0.50 10 10 0.802723
0.50 11 10 0.755119
0.50 12 10 0.774996
0.50 13 10 0.762498
0.50 14 10 0.764942
0.50 15 10 0.685548
0.50 16 10 0.785128
0.50 17 10 0.827140
0.50 18 10 0.768919
0.50 19 10 0.711161
0.50 20 10 0.720497
0.50 21 10 0.705480
0.50 22 10 0.705566
0.50 23 10 0.681339
0.50 24 10 0.875158
0.50 25 10 0.884822
0.50 26 10 0.869729
0.50 27 10 0.855971
0.50 28 10 0.840213
0.50 29 10 0.830339
0.50 30 10 0.821327
0.50 31 10 0.805299
0.50 32 10 1.051380
0.50 33 10 1.068212
0.50 34 10 0.986956
0.50 35 10 1.114543
0.50 36 10 1.086768
0.50 37 10 1.054355
0.50 38 10 1.034510
0.50 39 10 1.017812
0.50 40 10 1.024016
0.50 1 20 0.602273
0.50 2 20 0.756592
0.50 3 20 0.956352
0.50 4 20 0.768443
0.50 5 20 0.832608
0.50 6 20 0.650228
0.50 7 20 0.655464
0.50 8 20 0.728839
0.50 9 20 0.818522
0.50 10 20 0.701628
0.50 11 20 0.654386
0.50 12 20 0.860174
0.50 13 20 0.903440
0.50 14 20 0.845951
0.50 15 20 0.819050
0.50 16 20 1.035013
0.50 17 20 1.015029
0.50 18 20 0.930716
0.50 19 20 0.907920
0.50 20 20 0.914579
0.50 21 20 0.929996
0.50 22 20 0.980354
0.50 23 20 0.958083
0.50 24 20 1.056175
0.50 25 20 0.979388
0.50 26 20 0.918555
0.50 27 20 0.910534
0.50 28 20 0.971885
0.50 29 20 0.961905
0.50 30 20 0.941842
0.50 31 20 0.936239
0.50 32 20 1.159742
0.50 33 20 1.152365
0.50 34 20 1.093278
0.50 35 20 1.031730
0.50 36 20 1.067339
0.50 37 20 1.053831
0.50 38 20 1.012481
0.50 39 20 0.964157
0.50 40 20 1.016333
0.75 1 2 0.736842
0.75 2 2 0.902857
0.75 3 2 0.832636
0.75 4 2 1.127796
0.75 5 2 1.243767
0.75 6 2 1.364679
0.75 7 2 1.265976
0.75 8 2 1.572402
0.75 9 2 1.512570
0.75 10 2 1.705228
0.75 11 2 1.628931
0.75 12 2 1.815976
0.75 13 2 1.802285
0.75 14 2 1.788839
0.75 15 2 1.858200
0.75 16 2 1.853608
0.75 17 2 1.990148
0.75 18 2 2.043365
0.75 19 2 2.059983
0.75 20 2 2.097741
0.75 21 2 2.074773
0.75 22 2 2.125226
0.75 23 2 2.062688
0.75 24 2 2.228734
0.75 25 2 2.200163
0.75 26 2 2.221799
0.75 27 2 2.213362
0.75 28 2 2.215193
0.75 29 2 2.243599
0.75 30 2 2.265260
0.75 31 2 2.227916
0.75 32 2 2.582224
0.75 33 2 2.575805
0.75 34 2 2.558686
0.75 35 2 2.595912
0.75 36 2 2.572041
0.75 37 2 2.500160
0.75 38 2 2.577204
0.75 39 2 2.524955
0.75 40 2 2.575410
0.75 1 5 0.985075
0.75 2 5 0.763158
0.75 3 5 0.944573
0.75 4 5 1.043027
0.75 5 5 1.106460
0.75 6 5 1.058480
0.75 7 5 1.021215
0.75 8 5 1.148910
0.75 9 5 1.137128
0.75 10 5 1.112497
0.75 11 5 1.068092
0.75 12 5 1.145643
0.75 13 5 1.087245
0.75 14 5 1.130267
0.75 15 5 1.040339
0.75 16 5 1.206374
0.75 17 5 1.240003
0.75 18 5 1.348112
0.75 19 5 1.306045
0.75 20 5 1.317805
0.75 21 5 1.272962
0.75 22 5 1.289000
0.75 23 5 1.276298
0.75 24 5 1.368915
0.75 25 5 1.340212
0.75 26 5 1.312344
0.75 27 5 1.344943
0.75 28 5 1.334849
0.75 29 5 1.290645
0.75 30 5 1.271008
0.75 31 5 1.252056
0.75 32 5 1.515351
0.75 33 5 1.486818
0.75 34 5 1.467067
0.75 35 5 1.403172
0.75 36 5 1.220999
0.75 37 5 1.210747
0.75 38 5 1.187626
0.75 39 5 1.167779
0.75 40 5 1.175249
0.75 1 10 1.276596
0.75 2 10 0.833898
0.75 3 10 0.902758
0.75 4 10 0.914307
0.75 5 10 0.965015
0.75 6 10 0.877066
0.75 7 10 0.909091
0.75 8 10 1.010676
0.75 9 10 1.030499
0.75 10 10 1.007481
0.75 11 10 0.928306
0.75 12 10 1.004610
0.75 13 10 1.021065
0.75 14 10 0.993791
0.75 15 10 0.945101
0.75 16 10 1.096295
0.75 17 10 1.149184
0.75 18 10 1.113083
0.75 19 10 1.071716
0.75 20 10 1.082510
0.75 21 10 1.045888
0.75 22 10 1.102533
0.75 23 10 1.045615
0.75 24 10 1.120190
0.75 25 10 1.098540
0.75 26 10 1.059406
0.75 27 10 1.030966
0.75 28 10 1.033037
0.75 29 10 1.022366
0.75 30 10 1.014726
0.75 31 10 1.011907
0.75 32 10 1.208960
0.75 33 10 1.335119
0.75 34 10 1.379145
0.75 35 10 1.310285
0.75 36 10 1.267213
0.75 37 10 1.244083
0.75 38 10 1.218405
0.75 39 10 1.185468
0.75 40 10 1.403568
0.75 1 20 0.954545
0.75 2 20 0.740426
0.75 3 20 0.935825
0.75 4 20 0.922863
0.75 5 20 0.956009
0.75 6 20 0.854246
0.75 7 20 0.887026
0.75 8 20 1.017918
0.75 9 20 1.024796
0.75 10 20 0.942050
0.75 11 20 0.958937
0.75 12 20 1.021588
0.75 13 20 0.948884
0.75 14 20 0.903477
0.75 15 20 0.891936
0.75 16 20 1.412113
0.75 17 20 1.391156
0.75 18 20 1.267231
0.75 19 20 1.186695
0.75 20 20 1.388773
0.75 21 20 1.377368
0.75 22 20 1.344694
0.75 23 20 1.318689
0.75 24 20 1.451365
0.75 25 20 1.426674
0.75 26 20 1.372205
0.75 27 20 1.307741
0.75 28 20 1.299228
0.75 29 20 1.262797
0.75 30 20 1.240593
0.75 31 20 1.221706
0.75 32 20 1.596934
0.75 33 20 1.530585
0.75 34 20 1.504506
0.75 35 20 1.498731
0.75 36 20 1.478444
0.75 37 20 1.462232
0.75 38 20 1.435128
0.75 39 20 1.396399
0.75 40 20 1.461734
1.00 1 2 0.977528
1.00 2 2 0.822857
1.00 3 2 0.819231
1.00 4 2 1.166667
1.00 5 2 1.256000
1.00 6 2 1.317778
1.00 7 2 1.245819
1.00 8 2 1.541667
1.00 9 2 1.635328
1.00 10 2 1.649294
1.00 11 2 1.594480
1.00 12 2 1.821320
1.00 13 2 1.760135
1.00 14 2 1.917722
1.00 15 2 1.871446
1.00 16 2 1.926185
1.00 17 2 1.958791
1.00 18 2 1.987749
1.00 19 2 2.006437
1.00 20 2 2.073330
1.00 21 2 2.097189
1.00 22 2 2.061085
1.00 23 2 2.038678
1.00 24 2 2.212565
1.00 25 2 2.308955
1.00 26 2 2.230134
1.00 27 2 2.213822
1.00 28 2 2.330735
1.00 29 2 2.219316
1.00 30 2 2.281876
1.00 31 2 2.200080
1.00 32 2 2.516607
1.00 33 2 2.546390
1.00 34 2 2.573432
1.00 35 2 2.573845
1.00 36 2 2.555429
1.00 37 2 2.556754
1.00 38 2 2.641587
1.00 39 2 2.588066
1.00 40 2 2.637142
1.00 1 5 1.508197
1.00 2 5 0.804167
1.00 3 5 1.015345
1.00 4 5 1.028190
1.00 5 5 0.955649
1.00 6 5 1.052303
1.00 7 5 1.078454
1.00 8 5 1.219259
1.00 9 5 1.222356
1.00 10 5 1.214058
1.00 11 5 1.208257
1.00 12 5 1.238436
1.00 13 5 1.237160
1.00 14 5 1.289574
1.00 15 5 1.159021
1.00 16 5 1.411965
1.00 17 5 1.358945
1.00 18 5 1.335417
1.00 19 5 1.340178
1.00 20 5 1.327898
1.00 21 5 1.289363
1.00 22 5 1.287488
1.00 23 5 1.269258
1.00 24 5 1.326516
1.00 25 5 1.293962
1.00 26 5 1.297296
1.00 27 5 1.319378
1.00 28 5 1.289449
1.00 29 5 1.293005
1.00 30 5 1.260899
1.00 31 5 1.240946
1.00 32 5 1.482318
1.00 33 5 1.475870
1.00 34 5 1.466690
1.00 35 5 1.415656
1.00 36 5 1.424185
1.00 37 5 1.403096
1.00 38 5 1.376192
1.00 39 5 1.360330
1.00 40 5 1.367066
1.00 1 10 0.492063
1.00 2 10 0.861486
1.00 3 10 0.836305
1.00 4 10 1.035642
1.00 5 10 1.058361
1.00 6 10 1.140777
1.00 7 10 1.082254
1.00 8 10 1.351708
1.00 9 10 1.270816
1.00 10 10 1.233207
1.00 11 10 1.163999
1.00 12 10 1.217680
1.00 13 10 1.248432
1.00 14 10 1.203313
1.00 15 10 1.168862
1.00 16 10 1.423264
1.00 17 10 1.371786
1.00 18 10 1.296871
1.00 19 10 1.277051
1.00 20 10 1.258878
1.00 21 10 1.279368
1.00 22 10 1.252771
1.00 23 10 1.200952
1.00 24 10 1.304373
1.00 25 10 1.272911
1.00 26 10 1.298844
1.00 27 10 1.291975
1.00 28 10 1.261765
1.00 29 10 1.241308
1.00 30 10 1.199764
1.00 31 10 1.188305
1.00 32 10 1.456097
1.00 33 10 1.415493
1.00 34 10 1.387193
1.00 35 10 1.375507
1.00 36 10 1.365090
1.00 37 10 1.357948
1.00 38 10 1.339260
1.00 39 10 1.325723
1.00 40 10 1.341458
1.00 1 20 1.142857
1.00 2 20 0.756579
1.00 3 20 0.933206
1.00 4 20 1.107515
1.00 5 20 1.006865
1.00 6 20 1.119345
1.00 7 20 1.042171
1.00 8 20 1.279059
1.00 9 20 1.197219
1.00 10 20 1.219098
1.00 11 20 1.137432
1.00 12 20 1.296663
1.00 13 20 1.117636
1.00 14 20 1.140300
1.00 15 20 1.130867
1.00 16 20 1.345281
1.00 17 20 1.298988
1.00 18 20 1.273578
1.00 19 20 1.275561
1.00 20 20 1.277137
1.00 21 20 1.265707
1.00 22 20 1.272050
1.00 23 20 1.468941
1.00 24 20 1.614919
1.00 25 20 1.611308
1.00 26 20 1.591791
1.00 27 20 1.563769
1.00 28 20 1.540493
1.00 29 20 1.527145
1.00 30 20 1.483305
1.00 31 20 1.455346
1.00 32 20 1.894575
1.00 33 20 1.780600
1.00 34 20 1.722641
1.00 35 20 1.652664
1.00 36 20 1.789997
1.00 37 20 1.777880
1.00 38 20 1.749541
1.00 39 20 1.724420
1.00 40 20 1.787616
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from statsmodels.nonparametric.smoothers_lowess import lowess
data = pd.read_csv("piranha", sep=" ", header=None).values
sparseness = [0.25, 0.5, 0.75, 1]
lens = [5, 10, 15, 20]
alldata = {}
div = len(lens) * len(sparseness)
i = 0
for s in sparseness:
alldata[s] = {}
for c in lens:
xx = data[i:i+(len(data)/div), 1]
yy = data[i:i+(len(data)/div), 3]
filtered = lowess(yy, xx, is_sorted=True, frac=0.2, it=0)
alldata[s][c] = [filtered[:,0], filtered[:,1]]
i += len(data)/div
plt.figure(figsize=(15, 25))
plt.subplot(411)
plt.plot(alldata[1][5][0], alldata[1][5][1], 'r', alldata[1][10][0], alldata[1][10][1], 'g', alldata[1][15][0], alldata[1][15][1], 'b', alldata[1][20][0], alldata[1][20][1], 'y')
plt.axhline(y=1, color='black')
plt.legend(['Poly Length = 2', "Poly Length = 5", "Poly Length = 10", "Poly Length = 20"], loc=2)
plt.ylabel("Time taken `pow` : naive / withEBS")
plt.title("Sparseness : 1.0")
plt.subplot(412)
plt.plot(alldata[0.75][5][0], alldata[0.75][5][1], 'r', alldata[0.75][10][0], alldata[0.75][10][1], 'g', alldata[0.75][15][0], alldata[0.75][15][1], 'b', alldata[0.75][20][0], alldata[0.75][20][1], 'y')
plt.axhline(y=1, color='black')
plt.legend(['Poly Length = 2', "Poly Length = 5", "Poly Length = 10", "Poly Length = 20"], loc=2)
plt.ylabel("Time taken `pow` : naive / withEBS")
plt.title("Sparseness : 0.75")
plt.subplot(413)
plt.plot(alldata[0.5][5][0], alldata[0.5][5][1], 'r', alldata[0.5][10][0], alldata[0.5][10][1], 'g', alldata[0.5][15][0], alldata[0.5][15][1], 'b', alldata[0.5][20][0], alldata[0.5][20][1], 'y')
plt.axhline(y=1, color='black')
plt.legend(['Poly Length = 2', "Poly Length = 5", "Poly Length = 10", "Poly Length = 20"], loc=2)
plt.ylabel("Time taken `pow` : naive / withEBS")
plt.title("Sparseness : 0.5")
plt.subplot(414)
plt.plot(alldata[0.25][5][0], alldata[0.25][5][1], 'r', alldata[0.25][10][0], alldata[0.25][10][1], 'g', alldata[0.25][15][0], alldata[0.25][15][1], 'b', alldata[0.25][20][0], alldata[0.25][20][1], 'y')
plt.axhline(y=1, color='black')
plt.legend(['Poly Length = 2', "Poly Length = 5", "Poly Length = 10", "Poly Length = 20"], loc=2)
plt.ylabel("Time taken `pow` : naive / withEBS")
plt.title("Sparseness : 0.25")
plt.xlabel("Power Taken")
# plt.show()
plt.savefig("piranha.png")
0.25 1 2 0.914692
0.25 2 2 0.809302
0.25 3 2 0.977236
0.25 4 2 1.022727
0.25 5 2 1.154952
0.25 6 2 1.446953
0.25 7 2 1.476514
0.25 8 2 1.507573
0.25 9 2 1.701418
0.25 10 2 1.974614
0.25 11 2 2.049770
0.25 12 2 2.466080
0.25 13 2 2.508579
0.25 14 2 2.755612
0.25 15 2 2.787203
0.25 16 2 2.599537
0.25 17 2 2.732372
0.25 18 2 3.023744
0.25 19 2 3.148983
0.25 20 2 3.393708
0.25 21 2 3.543487
0.25 22 2 3.834051
0.25 23 2 4.010633
0.25 24 2 4.369284
0.25 25 2 4.513785
0.25 26 2 4.802431
0.25 27 2 5.000475
0.25 28 2 5.269277
0.25 29 2 5.375397
0.25 30 2 5.467456
0.25 31 2 5.518408
0.25 32 2 4.722686
0.25 33 2 4.877772
0.25 34 2 5.047751
0.25 35 2 5.136899
0.25 36 2 5.417200
0.25 37 2 5.595629
0.25 38 2 5.879135
0.25 39 2 5.944514
0.25 40 2 6.306650
0.25 1 5 0.792857
0.25 2 5 0.691466
0.25 3 5 0.818310
0.25 4 5 0.854361
0.25 5 5 1.109764
0.25 6 5 1.393807
0.25 7 5 1.533360
0.25 8 5 1.322977
0.25 9 5 1.631411
0.25 10 5 1.865136
0.25 11 5 2.173563
0.25 12 5 2.498991
0.25 13 5 2.726105
0.25 14 5 2.977612
0.25 15 5 3.189549
0.25 16 5 2.540133
0.25 17 5 2.822435
0.25 18 5 3.105834
0.25 19 5 3.373756
0.25 20 5 3.743944
0.25 21 5 3.982974
0.25 22 5 4.322650
0.25 23 5 4.545151
0.25 24 5 5.026132
0.25 25 5 5.458582
0.25 26 5 5.325868
0.25 27 5 5.389738
0.25 28 5 5.874439
0.25 29 5 5.991137
0.25 30 5 6.469860
0.25 31 5 6.612309
0.25 32 5 4.470475
0.25 33 5 4.760853
0.25 34 5 5.019763
0.25 35 5 5.381712
0.25 36 5 5.810513
0.25 37 5 6.234396
0.25 38 5 6.479315
0.25 39 5 6.892679
0.25 40 5 7.161990
0.25 1 10 0.834395
0.25 2 10 0.572391
0.25 3 10 0.858903
0.25 4 10 0.787762
0.25 5 10 1.125717
0.25 6 10 1.387424
0.25 7 10 1.723462
0.25 8 10 1.306716
0.25 9 10 1.703560
0.25 10 10 1.890212
0.25 11 10 2.388957
0.25 12 10 2.520637
0.25 13 10 2.869185
0.25 14 10 3.158777
0.25 15 10 3.472626
0.25 16 10 2.245224
0.25 17 10 2.638179
0.25 18 10 3.014491
0.25 19 10 3.374874
0.25 20 10 3.645337
0.25 21 10 4.114320
0.25 22 10 5.436353
0.25 23 10 4.686387
0.25 24 10 5.313654
0.25 25 10 5.659436
0.25 26 10 6.100713
0.25 27 10 6.099527
0.25 28 10 6.399863
0.25 29 10 6.871424
0.25 30 10 7.352224
0.25 31 10 7.472288
0.25 32 10 4.439260
0.25 33 10 4.764085
0.25 34 10 5.167819
0.25 35 10 5.441831
0.25 36 10 5.867848
0.25 37 10 6.791822
0.25 38 10 7.145518
0.25 39 10 7.052399
0.25 40 10 7.552248
0.25 1 20 0.872483
0.25 2 20 0.514416
0.25 3 20 0.811676
0.25 4 20 0.776032
0.25 5 20 1.194595
0.25 6 20 1.405444
0.25 7 20 1.522588
0.25 8 20 1.276056
0.25 9 20 1.571442
0.25 10 20 2.016707
0.25 11 20 2.333255
0.25 12 20 2.753829
0.25 13 20 3.011116
0.25 14 20 3.175826
0.25 15 20 3.594528
0.25 16 20 2.354520
0.25 17 20 2.723870
0.25 18 20 3.059678
0.25 19 20 3.456938
0.25 20 20 3.863935
0.25 21 20 4.276174
0.25 22 20 4.625532
0.25 23 20 5.097116
0.25 24 20 5.619105
0.25 25 20 5.948495
0.25 26 20 6.190010
0.25 27 20 6.588262
0.25 28 20 7.043773
0.25 29 20 7.367755
0.25 30 20 7.676271
0.25 31 20 7.923923
0.25 32 20 4.496545
0.25 33 20 4.675737
0.25 34 20 5.246616
0.25 35 20 5.620951
0.25 36 20 6.447319
0.25 37 20 6.422633
0.25 38 20 6.754324
0.25 39 20 7.383192
0.25 40 20 7.855619
0.50 1 2 1.264151
0.50 2 2 0.727012
0.50 3 2 0.977226
0.50 4 2 1.014514
0.50 5 2 1.176822
0.50 6 2 1.126058
0.50 7 2 1.508234
0.50 8 2 1.467343
0.50 9 2 1.703575
0.50 10 2 1.965986
0.50 11 2 2.249891
0.50 12 2 2.446119
0.50 13 2 2.536732
0.50 14 2 2.708597
0.50 15 2 2.801397
0.50 16 2 2.660016
0.50 17 2 2.760537
0.50 18 2 2.970699
0.50 19 2 3.179322
0.50 20 2 3.543196
0.50 21 2 3.689053
0.50 22 2 3.926349
0.50 23 2 4.070129
0.50 24 2 4.495186
0.50 25 2 4.407033
0.50 26 2 4.707016
0.50 27 2 4.883368
0.50 28 2 5.197266
0.50 29 2 5.227575
0.50 30 2 5.355698
0.50 31 2 5.528788
0.50 32 2 4.715000
0.50 33 2 4.878923
0.50 34 2 5.099911
0.50 35 2 5.318170
0.50 36 2 5.567345
0.50 37 2 5.746859
0.50 38 2 5.942800
0.50 39 2 6.087569
0.50 40 2 6.522742
0.50 1 5 0.737589
0.50 2 5 0.703170
0.50 3 5 0.909274
0.50 4 5 0.827189
0.50 5 5 1.078998
0.50 6 5 1.338525
0.50 7 5 1.421299
0.50 8 5 1.386764
0.50 9 5 1.660876
0.50 10 5 1.851761
0.50 11 5 2.123446
0.50 12 5 2.420099
0.50 13 5 2.563853
0.50 14 5 2.850000
0.50 15 5 2.900699
0.50 16 5 2.548105
0.50 17 5 2.698685
0.50 18 5 3.083780
0.50 19 5 3.289787
0.50 20 5 3.498774
0.50 21 5 3.883441
0.50 22 5 4.192586
0.50 23 5 4.395996
0.50 24 5 4.732297
0.50 25 5 5.070395
0.50 26 5 5.175910
0.50 27 5 5.390022
0.50 28 5 5.725956
0.50 29 5 5.869589
0.50 30 5 5.980732
0.50 31 5 6.052760
0.50 32 5 4.718761
0.50 33 5 4.803154
0.50 34 5 5.146460
0.50 35 5 5.449741
0.50 36 5 5.669892
0.50 37 5 6.194589
0.50 38 5 6.486901
0.50 39 5 6.741563
0.50 40 5 7.912440
0.50 1 10 0.771654
0.50 2 10 0.603306
0.50 3 10 0.832452
0.50 4 10 0.801377
0.50 5 10 1.062500
0.50 6 10 1.304911
0.50 7 10 1.542261
0.50 8 10 1.334692
0.50 9 10 1.676135
0.50 10 10 1.823103
0.50 11 10 2.144995
0.50 12 10 2.558114
0.50 13 10 2.733360
0.50 14 10 2.951734
0.50 15 10 3.144721
0.50 16 10 2.444389
0.50 17 10 3.036936
0.50 18 10 2.901025
0.50 19 10 3.126255
0.50 20 10 3.446236
0.50 21 10 3.878967
0.50 22 10 4.194275
0.50 23 10 4.409665
0.50 24 10 4.785898
0.50 25 10 5.228583
0.50 26 10 5.558375
0.50 27 10 5.874452
0.50 28 10 6.143919
0.50 29 10 6.108779
0.50 30 10 6.737099
0.50 31 10 6.934794
0.50 32 10 4.767741
0.50 33 10 4.987157
0.50 34 10 5.241559
0.50 35 10 5.597136
0.50 36 10 5.907028
0.50 37 10 6.225338
0.50 38 10 6.715327
0.50 39 10 6.823626
0.50 40 10 7.496635
0.50 1 20 0.756098
0.50 2 20 0.441955
0.50 3 20 0.836177
0.50 4 20 0.778261
0.50 5 20 1.077141
0.50 6 20 1.392073
0.50 7 20 1.576072
0.50 8 20 1.392021
0.50 9 20 1.687782
0.50 10 20 1.965591
0.50 11 20 2.356733
0.50 12 20 2.567729
0.50 13 20 2.953245
0.50 14 20 2.987619
0.50 15 20 3.370395
0.50 16 20 2.336102
0.50 17 20 2.796918
0.50 18 20 3.062628
0.50 19 20 3.249095
0.50 20 20 3.813200
0.50 21 20 4.256504
0.50 22 20 4.607054
0.50 23 20 4.954315
0.50 24 20 5.138470
0.50 25 20 5.760840
0.50 26 20 6.157701
0.50 27 20 6.344857
0.50 28 20 6.667209
0.50 29 20 7.052301
0.50 30 20 7.367440
0.50 31 20 7.641809
0.50 32 20 4.484027
0.50 33 20 4.783396
0.50 34 20 5.154079
0.50 35 20 5.438998
0.50 36 20 5.856919
0.50 37 20 6.251825
0.50 38 20 6.573495
0.50 39 20 7.086520
0.50 40 20 7.610518
0.75 1 2 1.137615
0.75 2 2 0.793413
0.75 3 2 0.969072
0.75 4 2 0.908093
0.75 5 2 1.227506
0.75 6 2 1.408834
0.75 7 2 1.516189
0.75 8 2 1.495605
0.75 9 2 1.699534
0.75 10 2 1.986826
0.75 11 2 2.150835
0.75 12 2 2.480212
0.75 13 2 2.604187
0.75 14 2 2.737527
0.75 15 2 2.753772
0.75 16 2 2.672266
0.75 17 2 2.925561
0.75 18 2 3.090474
0.75 19 2 3.321292
0.75 20 2 3.468708
0.75 21 2 3.632788
0.75 22 2 3.804067
0.75 23 2 3.919226
0.75 24 2 4.467749
0.75 25 2 4.616073
0.75 26 2 4.855361
0.75 27 2 4.856003
0.75 28 2 5.269576
0.75 29 2 5.185532
0.75 30 2 5.332501
0.75 31 2 5.315918
0.75 32 2 5.078590
0.75 33 2 5.060674
0.75 34 2 5.209260
0.75 35 2 5.407617
0.75 36 2 5.730045
0.75 37 2 5.891029
0.75 38 2 6.094378
0.75 39 2 6.251175
0.75 40 2 6.703397
0.75 1 5 1.152174
0.75 2 5 0.717241
0.75 3 5 0.888889
0.75 4 5 0.813139
0.75 5 5 1.074627
0.75 6 5 1.273566
0.75 7 5 1.436046
0.75 8 5 1.398310
0.75 9 5 1.581088
0.75 10 5 1.833333
0.75 11 5 2.082746
0.75 12 5 2.257100
0.75 13 5 2.528671
0.75 14 5 2.750998
0.75 15 5 2.806179
0.75 16 5 2.461348
0.75 17 5 2.693542
0.75 18 5 2.909660
0.75 19 5 3.150144
0.75 20 5 3.577767
0.75 21 5 3.814038
0.75 22 5 3.926140
0.75 23 5 4.255664
0.75 24 5 4.589660
0.75 25 5 4.754067
0.75 26 5 5.089580
0.75 27 5 5.204315
0.75 28 5 5.371425
0.75 29 5 5.502759
0.75 30 5 5.805142
0.75 31 5 5.840540
0.75 32 5 4.794480
0.75 33 5 4.965808
0.75 34 5 5.215178
0.75 35 5 5.486168
0.75 36 5 5.768421
0.75 37 5 5.867334
0.75 38 5 6.194930
0.75 39 5 6.524273
0.75 40 5 6.944672
0.75 1 10 1.055556
0.75 2 10 0.711268
0.75 3 10 0.789352
0.75 4 10 0.776333
0.75 5 10 1.033937
0.75 6 10 1.305660
0.75 7 10 1.434132
0.75 8 10 1.303419
0.75 9 10 1.567629
0.75 10 10 1.881818
0.75 11 10 2.014112
0.75 12 10 2.405635
0.75 13 10 2.603104
0.75 14 10 2.741958
0.75 15 10 2.986879
0.75 16 10 2.344939
0.75 17 10 2.832299
0.75 18 10 2.971747
0.75 19 10 3.121076
0.75 20 10 3.693670
0.75 21 10 3.826754
0.75 22 10 4.061846
0.75 23 10 4.525339
0.75 24 10 4.913280
0.75 25 10 5.205672
0.75 26 10 5.474229
0.75 27 10 5.682682
0.75 28 10 5.819804
0.75 29 10 6.252477
0.75 30 10 6.487270
0.75 31 10 6.681728
0.75 32 10 4.571510
0.75 33 10 4.837336
0.75 34 10 5.078223
0.75 35 10 5.461902
0.75 36 10 5.940086
0.75 37 10 6.252363
0.75 38 10 6.603040
0.75 39 10 6.912231
0.75 40 10 7.318323
0.75 1 20 1.090909
0.75 2 20 0.477876
0.75 3 20 0.744035
0.75 4 20 0.771753
0.75 5 20 1.033155
0.75 6 20 1.225306
0.75 7 20 1.683956
0.75 8 20 1.337605
0.75 9 20 1.627622
0.75 10 20 2.114197
0.75 11 20 2.106476
0.75 12 20 2.544220
0.75 13 20 3.010356
0.75 14 20 2.890791
0.75 15 20 2.977393
0.75 16 20 2.596344
0.75 17 20 2.752205
0.75 18 20 2.984405
0.75 19 20 3.397910
0.75 20 20 3.804277
0.75 21 20 3.841895
0.75 22 20 4.360931
0.75 23 20 4.640671
0.75 24 20 4.911469
0.75 25 20 5.530920
0.75 26 20 5.849605
0.75 27 20 6.201008
0.75 28 20 6.566386
0.75 29 20 6.842311
0.75 30 20 7.095940
0.75 31 20 7.184662
0.75 32 20 4.570738
0.75 33 20 4.892294
0.75 34 20 5.184086
0.75 35 20 5.545549
0.75 36 20 5.988142
0.75 37 20 6.387749
0.75 38 20 6.629179
0.75 39 20 6.998917
0.75 40 20 7.499544
1.00 1 2 0.801527
1.00 2 2 0.917722
1.00 3 2 0.985294
1.00 4 2 0.967695
1.00 5 2 1.228717
1.00 6 2 1.460840
1.00 7 2 1.357983
1.00 8 2 1.535519
1.00 9 2 1.756847
1.00 10 2 1.996778
1.00 11 2 2.129169
1.00 12 2 2.446420
1.00 13 2 2.531103
1.00 14 2 2.749891
1.00 15 2 2.811392
1.00 16 2 2.653605
1.00 17 2 2.924233
1.00 18 2 3.229664
1.00 19 2 3.333242
1.00 20 2 3.511730
1.00 21 2 3.608341
1.00 22 2 3.884774
1.00 23 2 3.979765
1.00 24 2 4.410953
1.00 25 2 4.614216
1.00 26 2 4.839812
1.00 27 2 4.833362
1.00 28 2 5.209396
1.00 29 2 5.323562
1.00 30 2 5.401223
1.00 31 2 5.500838
1.00 32 2 5.097064
1.00 33 2 5.278884
1.00 34 2 5.460411
1.00 35 2 5.275873
1.00 36 2 5.619079
1.00 37 2 5.809000
1.00 38 2 6.000622
1.00 39 2 6.161194
1.00 40 2 7.033415
1.00 1 5 1.292135
1.00 2 5 0.600000
1.00 3 5 0.886010
1.00 4 5 0.856672
1.00 5 5 1.064972
1.00 6 5 1.272414
1.00 7 5 1.433460
1.00 8 5 1.428295
1.00 9 5 1.628022
1.00 10 5 1.845672
1.00 11 5 2.034318
1.00 12 5 2.339090
1.00 13 5 2.390553
1.00 14 5 2.668741
1.00 15 5 2.911392
1.00 16 5 2.391692
1.00 17 5 2.710261
1.00 18 5 2.875334
1.00 19 5 3.184760
1.00 20 5 3.488053
1.00 21 5 3.679598
1.00 22 5 4.026458
1.00 23 5 4.199157
1.00 24 5 4.488469
1.00 25 5 4.915685
1.00 26 5 5.034532
1.00 27 5 5.188576
1.00 28 5 5.286657
1.00 29 5 5.566695
1.00 30 5 5.901061
1.00 31 5 5.719225
1.00 32 5 4.652324
1.00 33 5 5.031654
1.00 34 5 5.292633
1.00 35 5 5.326355
1.00 36 5 5.662430
1.00 37 5 5.886017
1.00 38 5 6.179214
1.00 39 5 6.272367
1.00 40 5 6.837083
1.00 1 10 0.788235
1.00 2 10 0.621429
1.00 3 10 0.776243
1.00 4 10 0.806452
1.00 5 10 1.044223
1.00 6 10 1.251483
1.00 7 10 1.406520
1.00 8 10 1.394057
1.00 9 10 1.569120
1.00 10 10 1.844057
1.00 11 10 1.948993
1.00 12 10 2.345729
1.00 13 10 2.515400
1.00 14 10 2.847084
1.00 15 10 2.956168
1.00 16 10 2.474504
1.00 17 10 2.929059
1.00 18 10 2.935948
1.00 19 10 2.977487
1.00 20 10 3.401753
1.00 21 10 3.891874
1.00 22 10 4.186199
1.00 23 10 4.339017
1.00 24 10 4.863859
1.00 25 10 4.885187
1.00 26 10 5.187032
1.00 27 10 5.573361
1.00 28 10 5.572383
1.00 29 10 6.122430
1.00 30 10 6.337053
1.00 31 10 6.374529
1.00 32 10 4.688931
1.00 33 10 4.871899
1.00 34 10 5.228466
1.00 35 10 5.565732
1.00 36 10 5.843917
1.00 37 10 6.119301
1.00 38 10 6.359681
1.00 39 10 6.488142
1.00 40 10 6.903079
1.00 1 20 0.916667
1.00 2 20 0.536765
1.00 3 20 0.746556
1.00 4 20 0.788368
1.00 5 20 1.027894
1.00 6 20 1.242932
1.00 7 20 1.465137
1.00 8 20 1.195720
1.00 9 20 1.624268
1.00 10 20 1.869690
1.00 11 20 2.464865
1.00 12 20 2.268240
1.00 13 20 2.743706
1.00 14 20 3.003367
1.00 15 20 3.221248
1.00 16 20 2.567977
1.00 17 20 2.817097
1.00 18 20 3.069472
1.00 19 20 3.420208
1.00 20 20 3.712713
1.00 21 20 3.866642
1.00 22 20 4.234468
1.00 23 20 4.288107
1.00 24 20 5.013800
1.00 25 20 5.343805
1.00 26 20 5.553578
1.00 27 20 5.649373
1.00 28 20 6.047210
1.00 29 20 6.837572
1.00 30 20 6.819217
1.00 31 20 7.088442
1.00 32 20 4.601062
1.00 33 20 4.880968
1.00 34 20 5.242559
1.00 35 20 5.659447
1.00 36 20 6.123919
1.00 37 20 6.458476
1.00 38 20 6.820244
1.00 39 20 7.039203
1.00 40 20 7.520757
#include <iostream>
#include <chrono>
#include <functional>
#include <symengine/basic.h>
#include <symengine/polys/uintpoly.h>
#include <symengine/polys/uintpoly_piranha.h>
#include <symengine/dict.h>
#include <random>
#include <algorithm>
#include <ctime>
using SymEngine::Basic;
using SymEngine::Add;
using SymEngine::Mul;
using SymEngine::Pow;
using SymEngine::Symbol;
using SymEngine::symbol;
using SymEngine::RCP;
using SymEngine::UIntPoly;
using SymEngine::UIntDict;
using SymEngine::map_uint_mpz;
using SymEngine::eq;
namespace SymEngine
{
RCP<const UIntPoly> pow_upoly_ebs(const UIntPoly &a, unsigned int p)
{
auto tmp = a.get_poly();
UIntDict res(1);
while (p > 1) {
if (p % 2 == 0) {
tmp = tmp * tmp;
p = p / 2;
} else {
res = res * tmp;
tmp = tmp * tmp;
p = (p - 1) / 2;
}
}
return make_rcp<const UIntPoly>(a.get_var(), std::move(res * tmp));
}
RCP<const UIntPoly> pow_upoly_naive(const UIntPoly &a, unsigned int p)
{
auto tmp = a.get_poly();
UIntDict res(1);
for (unsigned int i = 0; i < p; ++i)
res *= tmp;
return make_rcp<const UIntPoly>(a.get_var(), std::move(res));
}
}
using SymEngine::pow_upoly_ebs;
using SymEngine::pow_upoly_naive;
void benchmark_multiplication(double sparseness, int pow, int poly_len)
{
long long t1 = 0, t2 = 0;
int iterations = (60/poly_len);
for (int i = 0; i < iterations; ++i) {
int deg = ((double)(poly_len - 1)) / sparseness + 1;
int max_coeff = (1 << 10) - 1;
int min_coeff = 0;
int diff = max_coeff - min_coeff;
srand(time(NULL));
std::vector<int> nums(deg - 1);
for (unsigned int i = 0; i < nums.size(); ++i)
nums[i] = i;
std::shuffle(nums.begin(), nums.end(), std::default_random_engine(time(0)));
map_uint_mpz a_dict;
for (int i = 0; i < poly_len - 1; ++i)
a_dict[nums[i]] = ((rand() % 2 == 0) ? 1 : -1) * ((rand() % diff) + min_coeff);
a_dict[deg] = ((rand() % 2 == 0) ? 1 : -1) * ((rand() % diff) + min_coeff);
RCP<const Symbol> x = symbol("x");
RCP<const UIntPoly> a = UIntPoly::from_dict(x, std::move(a_dict));
auto ts = std::chrono::high_resolution_clock::now();
RCP<const UIntPoly> c = pow_upoly_ebs(*a, pow);
auto te = std::chrono::high_resolution_clock::now();
t1 += std::chrono::duration_cast<std::chrono::microseconds>(te - ts).count();
ts = std::chrono::high_resolution_clock::now();
RCP<const UIntPoly> d = pow_upoly_naive(*a, pow);
te = std::chrono::high_resolution_clock::now();
t2 += std::chrono::duration_cast<std::chrono::microseconds>(te - ts).count();
}
float ratio = ((float)t2) / ((float)t1);
printf("%.2f %d %d %.6f\n", sparseness, pow, poly_len, ratio);
return;
};
int main(int argc, char *argv[])
{
double sparsities[4] = {0.25, 0.5, 0.75, 1};
std::vector<int> pow;
for (int i = 1; i < 41; ++i)
pow.push_back(i);
int lens[4] = {2, 5, 10, 20};
for (int i = 0; i < 4; ++i)
{
auto ts = std::chrono::high_resolution_clock::now();
for (int k = 0; k < 4; ++k)
for (int j = 0; j < pow.size(); ++j)
benchmark_multiplication(sparsities[i], pow[j], lens[k]);
auto te = std::chrono::high_resolution_clock::now();
std::cout<<"TIME :"<<std::chrono::duration_cast<std::chrono::microseconds>(te - ts).count()<<std::endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment