Algorithms are taken from the paper "Lower Bounds for a Subexponential Optimization Algorithm" by Matoušek.
Linear Programming Problem is from Section 4 of the paper.
I used Euler Cluster with 48 cores(maximum available number of cores without a special request).
The following tests use d variables and 2d constraints.
| Number of Repeats | d | d*(d+3)/8 | Average Number of Basis Changes | Standard Deviation |
|---|---|---|---|---|
| 100'000 | 5 | 5.00 | 5.00 | 3.09 |
| 100'000 | 10 | 16.25 | 16.26 | 8.54 |
| 100'000 | 20 | 57.50 | 57.66 | 24.67 |
| 100'000 | 50 | 331.25 | 331.43 | 100.74 |
| 100'000 | 100 | 1287.50 | 1287.10 | 289.04 |
| 100'000 | 150 | 2868.75 | 2868.48 | 534.65 |
| 100'000 | 200 | 5075.00 | 5072.85 | 831.59 |
| 100'000 | 250 | 7906.25 | 7909.34 | 1168.91 |
| 100'000 | 300 | 11362.50 | 11352.50 | 1534.01 |
| 100'000 | 400 | 20150.00 | 20140.51 | 2378.50 |
- We observe around d(d+3)/8 basis changes, which aligns with the number of basis changes theoretically proven in the paper.
| Number of Repeats | d | Average Number of Basis Changes | Standard Deviation | |
|---|---|---|---|---|
| 100'000 | 5 | 4.98 | 9.36 | 3.17 |
| 100'000 | 10 | 17.13 | 23.62 | 10.98 |
| 100'000 | 20 | 76.15 | 87.54 | 56.67 |
| 100'000 | 50 | 1040.44 | 1177.40 | 1088.33 |
| 100'000 | 100 | 16'517 | 22'026 | 24'172 |
| 100'000 | 150 | 129'847 | 208'449 | 232'435 |
| 100'000 | 200 | 732'461 | 1'386'282 | 1'429'494 |
| 100'000 | 250 | 3'363'161 | 7'358'659 | 8'576'896 |
| 100'000 | 300 | 12'945'857 | 33'281'361 | 37'933'793 |
| 100'000 | 400 | 142'997'652 | 485'165'195 | 411'153'281 |
| 10'000 | 500 | 1'126'429'600 | 5'141'851'163 | 3'363'969'994 |
| 40 | 600 | 7'004'421'118 | 43'450'901'136 | 16'745'889'716 |
| 40 | 700 | 44'003'718'785 | 309'280'079'868 | 107'362'015'115 |
- There is a high variance going on.
![]() |
![]() |
| Number of Repeats | d | All Initial Bases Randomized | Worst Initial Basis Chosen: (0,0,0,...) | Median Best Basis Chosen(1,0,0,...) | Quartile Best Basis Chosen(1,1,0,...) | |
|---|---|---|---|---|---|---|
| 10'000 | 5 | 4.98 | 7.31 | 5.17 | 3.49 | 9.36 |
| 10'000 | 10 | 17.13 | 23.61 | 19.58 | 15.99 | 23.62 |
| 10'000 | 20 | 76.15 | 101.53 | 91.44 | 79.89 | 87.54 |
| 10'000 | 50 | 1040 | 1369 | 1281 | 1219 | 1177 |
| 10'000 | 100 | 16'517 | 21'621 | 20'872 | 19'881 | 22'026 |
| 10'000 | 150 | 129'847 | 171'007 | 163'053 | 158'793 | 208'449 |
| 10'000 | 200 | 732'461 | 962'074 | 933'594 | 897'786 | 1'386'281 |
| 10'000 | 250 | 3'363'161 | 4'355'781 | 4'240'430 | 4'082'864 | 7'358'657 |
| 10'000 | 300 | 12'945'857 | 17'241'407 | 16'634'965 | 15'841'373 | 33'281'361 |
Running 100000 times for each d in: 10 50 100 200 300 400 500 600 700 800 900 1000
| Number of Repeats | d | Average Number of Basis Changes | Standard Deviation | |
|---|---|---|---|---|
| 100'000 | 10 | 23.76 | 23.624327 | 10.81 |
| 100'000 | 50 | 1379.06 | 1177.403653 | 1312.32 |
| 100'000 | 100 | 21'759.94 | 22'026.465794 | 28'386.05 |
| 100'000 | 200 | 961'099.83 | 1'386'280.750628 | 1'934'625.93 |
| 100'000 | 300 | 16'862'009.58 | 33'281'358.719768 | 41'724'756.54 |
| 100'000 | 400 | 188'967'445.80 | 485'165'195.409790 | 542'839'461.14 |
| 10'000 | 500 | 1'588'269'981.77 | 5'141'851'162.901374 | 5'878'385'919.68 |
I brute-force all possible outcomes upto d=6 to find the exact expected value for the one-permutation variant. For a given d, there are
Expected Value for d=1: 0.5
| Basis: | 1 | 0 |
|---|---|---|
| Expected Number of Basis Changes: | 0 | 1 |
|
|
0 | 2 |
Expected Value for d=2: 1.25
| Basis: | 1,1 | 1,0 | 0,0 | 0,1 |
|---|---|---|---|---|
| Expected Number of Basis Changes: | 0 | 1 | 2 | 2 |
|
|
0 | 24 | 48 | 48 |
Expected Value for d=3: 2.24167
| Basis: | 1,1,1 | 1,1,0 | 1,0,0 | 1,0,1 | 0,0,1 | 0,1,1 | 0,1,0 | 0,0,0 |
|---|---|---|---|---|---|---|---|---|
| Expected Number of Basis Changes: | 0 | 1 | 2 | 2 | 3 | 3.1 | 3.33333 | 3.5 |
|
|
0 | 720 | 1440 | 1440 | 2160 | 2232 | 2400 | 2520 |
Expected Value for d=4: 3.48274
| Basis: | 1,1,1,1 | 1,1,1,0 | 1,1,0,0 | 1,1,0,1 | 1,0,0,1 | 1,0,1,1 | 1,0,1,0 | 1,0,0,0 | 0,0,1,1 | 0,1,1,1 | 0,1,1,0 | 0,0,1,0 | 0,1,0,1 | 0,1,0,0 | 0,0,0,1 | 0,0,0,0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Expected Number of Basis Changes: | 0 | 1 | 2 | 2 | 3 | 3.1 | 3.33333 | 3.5 | 4.1 | 4.33333 | 4.66032 | 4.69444 | 4.70476 | 5.04206 | 5.07222 | 5.18333 |
|
|
0 | 40320 | 80640 | 80640 | 120960 | 124992 | 134400 | 141120 | 165312 | 174720 | 187904 | 189280 | 189696 | 203296 | 204512 | 208992 |
Expected Value for d=5: 4.987
| Basis: | 1,1,1,1,1 | 1,1,1,1,0 | 1,1,1,0,0 | 1,1,1,0,1 | 1,1,0,0,1 | 1,1,0,1,1 | 1,1,0,1,0 | 1,1,0,0,0 | 1,0,0,1,1 | 1,0,1,1,1 | 1,0,1,1,0 | 1,0,0,1,0 | 1,0,1,0,1 | 1,0,1,0,0 | 1,0,0,0,1 | 1,0,0,0,0 | 0,0,1,1,1 | 0,1,1,1,1 | 0,0,1,1,0 | 0,1,1,1,0 | 0,1,0,1,1 | 0,1,1,0,1 | 0,0,1,0,1 | 0,1,1,0,0 | 0,0,1,0,0 | 0,1,0,1,0 | 0,0,0,1,1 | 0,1,0,0,1 | 0,0,0,0,1 | 0,1,0,0,0 | 0,0,0,1,0 | 0,0,0,0,0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Expected Number of Basis Changes: | 0 | 1 | 2 | 2 | 3 | 3.1 | 3.33333 | 3.5 | 4.1 | 4.33333 | 4.66032 | 4.69444 | 4.70476 | 5.04206 | 5.07222 | 5.18333 | 5.33333 | 5.72068 | 5.9619 | 6.09562 | 6.21112 | 6.28733 | 6.47421 | 6.55101 | 6.55159 | 6.66712 | 6.80317 | 6.85242 | 6.95486 | 7.02064 | 7.06478 | 7.31052 |
|
|
0 | 3628800 | 7257600 | 7257600 | 10886400 | 11249280 | 12096000 | 12700800 | 14878080 | 15724800 | 16911360 | 17035200 | 17072640 | 18296640 | 18406080 | 18809280 | 19353600 | 20759220 | 21634560 | 22119780 | 22538900 | 22815460 | 23493600 | 23772300 | 23774400 | 24193660 | 24687360 | 24866060 | 25237800 | 25476500 | 25636680 | 26528400 |
Expected Value for d=6: 6.77171
| Basis: | 1,1,1,1,1,1 | 1,1,1,1,1,0 | 1,1,1,1,0,0 | 1,1,1,1,0,1 | 1,1,1,0,0,1 | 1,1,1,0,1,1 | 1,1,1,0,1,0 | 1,1,1,0,0,0 | 1,1,0,0,1,1 | 1,1,0,1,1,1 | 1,1,0,1,1,0 | 1,1,0,0,1,0 | 1,1,0,1,0,1 | 1,1,0,1,0,0 | 1,1,0,0,0,1 | 1,1,0,0,0,0 | 1,0,0,1,1,1 | 1,0,1,1,1,1 | 1,0,0,1,1,0 | 1,0,1,1,1,0 | 1,0,1,0,1,1 | 1,0,1,1,0,1 | 1,0,0,1,0,1 | 1,0,1,1,0,0 | 1,0,0,1,0,0 | 1,0,1,0,1,0 | 0,0,1,1,1,1 | 1,0,0,0,1,1 | 1,0,1,0,0,1 | 1,0,0,0,0,1 | 1,0,1,0,0,0 | 1,0,0,0,1,0 | 0,1,1,1,1,1 | 1,0,0,0,0,0 | 0,0,1,1,1,0 | 0,1,1,1,1,0 | 0,1,0,1,1,1 | 0,0,1,1,0,1 | 0,1,1,1,0,1 | 0,0,1,1,0,0 | 0,1,1,0,1,1 | 0,1,1,1,0,0 | 0,1,0,1,1,0 | 0,0,1,0,1,1 | 0,1,1,0,1,0 | 0,0,1,0,0,1 | 0,1,1,0,0,1 | 0,0,1,0,1,0 | 0,0,0,1,1,1 | 0,1,0,1,0,1 | 0,1,1,0,0,0 | 0,1,0,0,1,1 | 0,1,0,1,0,0 | 0,0,1,0,0,0 | 0,0,0,0,1,1 | 0,0,0,1,1,0 | 0,1,0,0,0,1 | 0,1,0,0,1,0 | 0,0,0,1,0,1 | 0,0,0,0,1,0 | 0,1,0,0,0,0 | 0,0,0,1,0,0 | 0,0,0,0,0,1 | 0,0,0,0,0,0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Expected Number of Basis Changes: | 0 | 1 | 2 | 2 | 3 | 3.1 | 3.33333 | 3.5 | 4.1 | 4.33333 | 4.66032 | 4.69444 | 4.70476 | 5.04206 | 5.07222 | 5.18333 | 5.33333 | 5.72068 | 5.9619 | 6.09562 | 6.21112 | 6.28733 | 6.47421 | 6.55101 | 6.55159 | 6.66712 | 6.72068 | 6.80317 | 6.85242 | 6.95486 | 7.02064 | 7.06478 | 7.27917 | 7.31052 | 7.36584 | 7.68229 | 7.88853 | 7.92365 | 7.94732 | 7.98774 | 8.07302 | 8.1715 | 8.3906 | 8.42905 | 8.4633 | 8.51934 | 8.56396 | 8.67128 | 8.72761 | 8.74586 | 8.76458 | 8.84516 | 8.86819 | 8.88659 | 8.90328 | 9.05546 | 9.11984 | 9.13092 | 9.17188 | 9.3574 | 9.41307 | 9.44023 | 9.57584 | 9.72235 |
|
|
0 | 479001600 | 958003200 | 958003200 | 1437004800 | 1484904960 | 1596672000 | 1676505600 | 1963906560 | 2075673600 | 2232299520 | 2248646400 | 2253588480 | 2415156480 | 2429602560 | 2482824960 | 2554675200 | 2740217040 | 2855761920 | 2919810960 | 2975134800 | 3011640720 | 3101155200 | 3137943600 | 3138220800 | 3193563120 | 3219218640 | 3258731520 | 3282319920 | 3331389600 | 3362898000 | 3384041760 | 3486734160 | 3501748800 | 3528249120 | 3679827600 | 3778616712 | 3795440616 | 3806778480 | 3826140648 | 3866988672 | 3914163720 | 4019110536 | 4037528352 | 4053935160 | 4080778944 | 4102151208 | 4153556352 | 4180538208 | 4189280472 | 4198250016 | 4236846120 | 4247876952 | 4256690592 | 4264686624 | 4337577552 | 4368419688 | 4373725584 | 4393347552 | 4482209424 | 4508874360 | 4521887040 | 4586844768 | 4657020720 |
-
lpsw.cpp: Implements the Standard Sharir-Welzl Algorithm (Section 2 of the paper). Initial Start Basis is rerandomized in every run.- Takes
d(number of variables) as an argument. - Compile and test using:
g++ -o lpsw lpsw.cpp -std=c++17 -O3 ./lpsw <d>
- Takes
-
lpswop.cpp: Implements the One Permutation Variant of the Sharir-Welzl Algorithm (Section 3 of the paper). Initial Start Basis is rerandomized in every run.- Takes
d(number of variables) as an argument. - Compile and test using:
g++ -o lpswop lpswop.cpp -std=c++17 -O3 ./lpswop <d>
- Takes
-
fastlpswop.cpp: Faster running version oflpswop.cpp.- The number of variables
dis defined using a preprocesser macroDVAL, which defaults to 10 if not specified. - Compile and test using:
g++ -o fastlpswop fastlpswop.cpp -std=c++17 -O3 -DDVAL=<d> ./fastlpswop
- The number of variables
-
bruteforce.cpp: Used for finding the exact expected value of one-permutation variant.- For a given D, for every d in [1,...,D] prints the exact expected value and the expected value for every basis choice.
- Compile and test using:
g++ -o bruteforce bruteforce.cpp -std=c++17 -O3 ./bruteforce <D>
- Runtime for D is
$\Omega((2D)! \cdot 2^D)$ , so only works up to D=5.
-
runlpsw.sh: A bash script for parallelizing the runs oflpsw.cpp. Uses all the cores available.- Before running the script for the first time, make it executable:
chmod +x runlpsw.sh
- Option 0:
- Takes 'r' (number of repeats) and 'd' (number of variables).
./runlpsw.sh <r> 0 <d>
- Takes 'r' (number of repeats) and 'd' (number of variables).
- Option 1:
- Takes 'r' (number of repeats), while the list of variable values 'd' is hardcoded in
runlpsw.sh. This option was primarily designed to genereate runtime table for multiple d values in a single run../runlpsw.sh <r> 1
- Takes 'r' (number of repeats), while the list of variable values 'd' is hardcoded in
- Before running the script for the first time, make it executable:
-
runlpswop.sh: A bash script for parallelizing the runs oflpswop.cpp. Uses all the cores available.- Before running the script for the first time, make it executable:
chmod +x runlpswop.sh
- Option 0:
- Takes 'r' (number of repeats) and 'd' (number of variables).
./runlpswop.sh <r> 0 <d>
- Takes 'r' (number of repeats) and 'd' (number of variables).
- Option 1:
- Takes 'r' (number of repeats), while the list of variable values 'd' is hardcoded in
runlpswop.sh. This option was primarily designed to genereate runtime table for multiple d values in a single run../runlpswop.sh <r> 1
- Takes 'r' (number of repeats), while the list of variable values 'd' is hardcoded in
- Before running the script for the first time, make it executable:
-
runfastlpswop.sh: A bash script for parallelizing the runs offastlpswop.cpp. Uses all the cores available.- Before running the script for the first time, make it executable:
chmod +x runfastlpswop.sh
- Option 0:
- Takes 'r' (number of repeats) and 'd' (number of variables).
./runfastlpswop.sh <r> 0 <d>
- Takes 'r' (number of repeats) and 'd' (number of variables).
- Option 1:
- Takes 'r' (number of repeats), while the list of variable values 'd' is hardcoded in
runfastlpswop.sh. This option was primarily designed to genereate runtime table for multiple d values in a single run../runfastlpswop.sh <r> 1
- Takes 'r' (number of repeats), while the list of variable values 'd' is hardcoded in
- Before running the script for the first time, make it executable:



