From d926a5d9f2ba2b0d6b5b79f310fd6aec2d8570b8 Mon Sep 17 00:00:00 2001 From: siddharth0a Date: Tue, 2 Apr 2024 20:14:28 +0900 Subject: [PATCH] consensus/eccpow: add LDPCDifficulty function --- consensus/eccpow/LDPCDifficulty.go | 209 +++++++++ consensus/eccpow/LDPCDifficulty_test.go | 65 +++ consensus/eccpow/LDPCDifficulty_utils.go | 518 +++++++++++++++++++++++ 3 files changed, 792 insertions(+) create mode 100644 consensus/eccpow/LDPCDifficulty.go create mode 100644 consensus/eccpow/LDPCDifficulty_test.go create mode 100644 consensus/eccpow/LDPCDifficulty_utils.go diff --git a/consensus/eccpow/LDPCDifficulty.go b/consensus/eccpow/LDPCDifficulty.go new file mode 100644 index 0000000000..36c6f4f6f4 --- /dev/null +++ b/consensus/eccpow/LDPCDifficulty.go @@ -0,0 +1,209 @@ +package eccpow + +import ( + "math" + "math/big" + + "github.com/cryptoecc/ETH-ECC/core/types" +) + +/* + https://ethereum.stackexchange.com/questions/5913/how-does-the-ethereum-homestead-difficulty-adjustment-algorithm-work?noredirect=1&lq=1 + https://github.com/ethereum/EIPs/issues/100 + + Ethereum difficulty adjustment + algorithm: + diff = (parent_diff + + (parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)) + ) + 2^(periodCount - 2) + + LDPC difficulty adjustment + algorithm: + diff = (parent_diff + + (parent_diff / 256 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // BlockGenerationTime), -99))) + + Why 8? + This number is sensitivity of blockgeneration time + If this number is high, difficulty is not changed much when block generation time is different from goal of block generation time + But if this number is low, difficulty is changed much when block generatin time is different from goal of block generation time + +*/ + +// "github.com/cryptoecc/ETH-ECC/consensus/ethash/consensus.go" +// Some weird constants to avoid constant memory allocs for them. +var ( + MinimumDifficulty = ProbToDifficulty(Table[0].miningProb) + BlockGenerationTime = big.NewInt(36) // 36) // 10 ) // 36) + Sensitivity = big.NewInt(8) + + // BlockGenerationTime for Seoul + BlockGenerationTimeSeoul = big.NewInt(10) // 36) // 10 ) // 36) + SeoulDifficulty = big.NewInt(1023) + + //initLevel int = 10 + minLevel int = 10 + diff_interval = 100 + + //count int = -1 + //init_c int = 2 +) + +const ( + // frontierDurationLimit is for Frontier: + // The decision boundary on the blocktime duration used to determine + // whether difficulty should go up or down. + frontierDurationLimit = 10 + // minimumDifficulty The minimum that the difficulty may ever be. + minimumDifficulty = 131072 + // expDiffPeriod is the exponential difficulty period + expDiffPeriodUint = 100000 + // difficultyBoundDivisorBitShift is the bound divisor of the difficulty (2048), + // This constant is the right-shifts to use for the division. + difficultyBoundDivisor = 11 +) + +// MakeLDPCDifficultyCalculator calculate difficulty using difficulty table +func MakeLDPCDifficultyCalculator() func(time uint64, parent *types.Header) *big.Int { + return func(time uint64, parent *types.Header) *big.Int { + bigTime := new(big.Int).SetUint64(time) + bigParentTime := new(big.Int).SetUint64(parent.Time) + + // holds intermediate values to make the algo easier to read & audit + x := new(big.Int) + y := new(big.Int) + + // (2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // BlockGenerationTime + x.Sub(bigTime, bigParentTime) + //fmt.Printf("block_timestamp - parent_timestamp : %v\n", x) + + x.Div(x, BlockGenerationTime) + //fmt.Printf("(block_timestamp - parent_timestamp) / BlockGenerationTime : %v\n", x) + + if parent.UncleHash == types.EmptyUncleHash { + //fmt.Printf("No uncle\n") + x.Sub(big1, x) + } else { + //fmt.Printf("Uncle block exists") + x.Sub(big2, x) + } + //fmt.Printf("(2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) / BlockGenerationTime : %v\n", x) + + // max((2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // 9, -99) + if x.Cmp(bigMinus99) < 0 { + x.Set(bigMinus99) + } + //fmt.Printf("max(1 - (block_timestamp - parent_timestamp) / BlockGenerationTime, -99) : %v\n", x) + + // parent_diff + (parent_diff / Sensitivity * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // BlockGenerationTime), -99)) + y.Div(parent.Difficulty, Sensitivity) + //fmt.Printf("parent.Difficulty / 8 : %v\n", y) + + x.Mul(y, x) + //fmt.Printf("parent.Difficulty / 8 * max(1 - (block_timestamp - parent_timestamp) / BlockGenerationTime, -99) : %v\n", x) + + x.Add(parent.Difficulty, x) + //fmt.Printf("parent.Difficulty - parent.Difficulty / 8 * max(1 - (block_timestamp - parent_timestamp) / BlockGenerationTime, -99) : %v\n", x) + + // minimum difficulty can ever be (before exponential factor) + if x.Cmp(MinimumDifficulty) < 0 { + x.Set(MinimumDifficulty) + } + + //fmt.Printf("x : %v, Minimum difficulty : %v\n", x, MinimumDifficulty) + return x + } +} + +func MakeLDPCDifficultyCalculator_Seoul() func(time uint64, parent *types.Header) *big.Int { + return func(time uint64, parent *types.Header) *big.Int { + bigTime := new(big.Int).SetUint64(time) + bigParentTime := new(big.Int).SetUint64(parent.Time) + + // holds intermediate values to make the algo easier to read & audit + x := new(big.Int) + y := new(big.Int) + + // (2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // BlockGenerationTime + x.Sub(bigTime, bigParentTime) + //fmt.Printf("block_timestamp - parent_timestamp : %v\n", x) + + x.Div(x, BlockGenerationTimeSeoul) + //fmt.Printf("(block_timestamp - parent_timestamp) / BlockGenerationTime : %v\n", x) + + if parent.UncleHash == types.EmptyUncleHash { + //fmt.Printf("No uncle\n") + x.Sub(big1, x) + } else { + //fmt.Printf("Uncle block exists") + x.Sub(big2, x) + } + //fmt.Printf("(2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) / BlockGenerationTime : %v\n", x) + + // max((2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // 9, -99) + if x.Cmp(bigMinus99) < 0 { + x.Set(bigMinus99) + } + //fmt.Printf("max(1 - (block_timestamp - parent_timestamp) / BlockGenerationTime, -99) : %v\n", x) + + // parent_diff + (parent_diff / Sensitivity * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // BlockGenerationTime), -99)) + y.Div(parent.Difficulty, Sensitivity) + //fmt.Printf("parent.Difficulty / 8 : %v\n", y) + + x.Mul(y, x) + //fmt.Printf("parent.Difficulty / 8 * max(1 - (block_timestamp - parent_timestamp) / BlockGenerationTime, -99) : %v\n", x) + + x.Add(parent.Difficulty, x) + //fmt.Printf("parent.Difficulty - parent.Difficulty / 8 * max(1 - (block_timestamp - parent_timestamp) / BlockGenerationTime, -99) : %v\n", x) + + // minimum difficulty can ever be (before exponential factor) + if x.Cmp(SeoulDifficulty) < 0 { + x.Set(SeoulDifficulty) + } + + //fmt.Printf("x : %v, Minimum difficulty : %v\n", x, MinimumDifficulty) + return x + } +} + +// SearchLevel return next level by using currentDifficulty of header +// Type of Ethereum difficulty is *bit.Int so arg is *big.int +func SearchLevel(difficulty *big.Int) int { + // foo := MakeLDPCDifficultyCalculator() + // Next level := SearchNextLevel(foo(currentBlock's time stamp, parentBlock)) + + var currentProb = DifficultyToProb(difficulty) + var level int + + distance := 1.0 + for i := range Table { + if math.Abs(currentProb-Table[i].miningProb) <= distance { + level = Table[i].level + distance = math.Abs(currentProb - Table[i].miningProb) + } else { + break + } + } + + return level +} + +// SearchLevel return next level by using currentDifficulty of header +// Type of Ethereum difficulty is *bit.Int so arg is *big.int +func SearchLevel_Seoul(difficulty *big.Int) int { + + var level int + + difficultyf := new(big.Rat).SetInt(difficulty) + level_prob := big.NewRat(29, 20) + difficultyf.Quo(difficultyf, new(big.Rat).SetInt(SeoulDifficulty)) + + for { + difficultyf.Quo(difficultyf, level_prob) + level++ + if difficultyf.Cmp(big.NewRat(1, 1)) < 0 { + break + } + } + + return level +} diff --git a/consensus/eccpow/LDPCDifficulty_test.go b/consensus/eccpow/LDPCDifficulty_test.go new file mode 100644 index 0000000000..dbb58c034a --- /dev/null +++ b/consensus/eccpow/LDPCDifficulty_test.go @@ -0,0 +1,65 @@ +package eccpow + +import ( + "fmt" + "math" + "math/big" + "testing" + "time" + + "github.com/cryptoecc/ETH-ECC/core/types" +) + +func TestTablePrint(t *testing.T) { + for i := range Table { + fmt.Printf("level : %v, n : %v, wc : %v, wr : %v, decisionFrom : %v, decisionTo : %v, decisionStep : %v, miningProb : %v \n", Table[i].level, Table[i].n, Table[i].wc, Table[i].wr, Table[i].decisionFrom, Table[i].decisionTo, Table[i].decisionStep, Table[i].miningProb) + } +} + +func TestPrintReciprocal(t *testing.T) { + for i := range Table { + val := 1 / Table[i].miningProb + bigInt := FloatToBigInt(val) + fmt.Printf("Reciprocal of miningProb : %v \t big Int : %v\n", val, bigInt) + } +} + +func TestConversionFunc(t *testing.T) { + for i := range Table { + difficulty := ProbToDifficulty(Table[i].miningProb) + miningProb := DifficultyToProb(difficulty) + + // Consider only integer part. + fmt.Printf("Difficulty : %v \t MiningProb : %v\t, probability compare : %v \n", difficulty, miningProb, math.Abs(miningProb-Table[i].miningProb) < 1) + } +} + +func TestDifficultyChange(t *testing.T) { + var hash []byte + currentLevel := 0 + currentBlock := new(types.Header) + // Parent block's timestamp is 0 + // compare elapse time(timestamp) and parent block's timestamp(0) + currentBlock.Difficulty = big.NewInt(0) + currentBlock.Time = 0 + currentBlock.UncleHash = types.EmptyUncleHash + for i := 0; i < 5; i++ { + fmt.Printf("Current Difficulty : %v\n", currentBlock.Difficulty) + + startTime := time.Now() + + RunOptimizedConcurrencyLDPC(currentBlock, hash) + timeStamp := uint64(time.Since(startTime).Seconds()) + fmt.Printf("Block generation time : %v\n", timeStamp) + + difficultyCalculator := MakeLDPCDifficultyCalculator() + nextDifficulty := difficultyCalculator(timeStamp, currentBlock) + currentBlock.Difficulty = nextDifficulty + nextLevel := SearchLevel(nextDifficulty) + + fmt.Printf("Current prob : %v, Next Level : %v, Next difficulty : %v, Next difficulty from table : %v\n\n", Table[currentLevel].miningProb, Table[nextLevel].level, nextDifficulty, ProbToDifficulty(Table[nextLevel].miningProb)) + // currentBlock.ParentHash = outputWord conversion from []int to [32]byte + currentLevel = nextLevel + fmt.Printf("Current Level : %v\n", currentLevel) + } +} diff --git a/consensus/eccpow/LDPCDifficulty_utils.go b/consensus/eccpow/LDPCDifficulty_utils.go new file mode 100644 index 0000000000..79037bb5b8 --- /dev/null +++ b/consensus/eccpow/LDPCDifficulty_utils.go @@ -0,0 +1,518 @@ +package eccpow + +import ( + "math/big" +) + +// Table : level, n, wc, wr, decisionFrom, decisionTo, decisionStep, _, miningProb +/* + How to decision + 1. The number of ones in outputword % decision_step == 0 + 2. The number of ones in outputword exists between decision_from to decision_to + + How to change difficulty level + - Reciprocal of difficulty is probability + - Therefore We can define difficulty is reciprocal of probability + - Find close probability + +*/ +type difficulty struct { + level int + n int + wc int + wr int + decisionFrom int + decisionTo int + decisionStep int + _ float32 + miningProb float64 +} + +// FloatToBigInt convert float64 to big integer +func FloatToBigInt(val float64) *big.Int { + // float64 -> bit float -> big int + bigFloat := big.NewFloat(val) + bigInt := new(big.Int) + bigFloat.Int(bigInt) + + return bigInt +} + +// BigIntToFloat convert big int to float64 +func BigIntToFloat(val *big.Int) float64 { + // big int -> bit float -> float64 + bigFloat := new(big.Float).SetInt(val) + floatVal, _ := bigFloat.Float64() + + return floatVal +} + +// DifficultyToProb convert difficulty to probability of table +func DifficultyToProb(difficulty *big.Int) float64 { + //big Int -> 1/bigInt -> float64 + prob := 1 / BigIntToFloat(difficulty) + return prob +} + +// ProbToDifficulty convert probability to difficulty of header +func ProbToDifficulty(miningProb float64) *big.Int { + // float64 -> 1/float64 -> big Int + difficulty := FloatToBigInt(1 / miningProb) + return difficulty +} + + +func getTable(level int ) difficulty { + n := 64 + level * 4 + return difficulty{level, n, 3, 4, 1/4 * n, 3/4 * n, 1, 0, 0} +} + + +// Table is difficulty table slice +var Table = []difficulty{ + {0, 32, 3, 4, 10, 22, 2, 0.329111, 3.077970e-05}, + {1, 32, 3, 4, 10, 22, 2, 0.329111, 3.077970e-05}, + {2, 32, 3, 4, 10, 16, 2, 0.329111, 2.023220e-05}, + {3, 32, 3, 4, 16, 16, 1, 0.329111, 9.684650e-06}, + {4, 32, 3, 4, 14, 14, 1, 0.329111, 6.784080e-06}, + {5, 36, 3, 4, 12, 24, 2, 0.329111, 4.830240e-06}, + {6, 36, 3, 4, 12, 18, 2, 0.369449, 3.125970e-06}, + {7, 32, 3, 4, 12, 12, 1, 0.369449, 2.862890e-06}, + {8, 44, 3, 4, 14, 30, 2, 0.369449, 1.637790e-06}, + {9, 36, 3, 4, 18, 18, 1, 0.369449, 1.421700e-06}, + {10, 36, 3, 4, 16, 16, 1, 0.369449, 1.051350e-06}, + {11, 44, 3, 4, 14, 22, 2, 0.411046, 1.029740e-06}, + {12, 40, 3, 4, 12, 28, 2, 0.411046, 7.570880e-07}, + {13, 36, 3, 4, 14, 14, 1, 0.411046, 4.865630e-07}, + {14, 40, 3, 4, 12, 20, 2, 0.411046, 4.813320e-07}, + {15, 44, 3, 4, 22, 22, 1, 0.411046, 4.216920e-07}, + {16, 44, 3, 4, 20, 20, 1, 0.411046, 3.350070e-07}, + {17, 48, 3, 4, 14, 34, 2, 0.452453, 2.677070e-07}, + {18, 40, 3, 4, 20, 20, 1, 0.452453, 2.055750e-07}, + {19, 44, 3, 4, 18, 18, 1, 0.452453, 1.788400e-07}, + {20, 48, 3, 4, 14, 24, 2, 0.452453, 1.664080e-07}, + {21, 40, 3, 4, 18, 18, 1, 0.452453, 1.583110e-07}, + {22, 40, 3, 4, 16, 16, 1, 0.452453, 7.917230e-08}, + {23, 44, 3, 4, 16, 16, 1, 0.498513, 7.103820e-08}, + {24, 48, 3, 4, 24, 24, 1, 0.498513, 6.510890e-08}, + {25, 48, 3, 4, 22, 22, 1, 0.498513, 5.300760e-08}, + {26, 52, 3, 4, 14, 40, 2, 0.498513, 4.266600e-08}, + {27, 48, 3, 4, 20, 20, 1, 0.498513, 2.990510e-08}, + {28, 40, 3, 4, 14, 14, 1, 0.498513, 2.927380e-08}, + {29, 52, 3, 4, 14, 26, 2, 0.498513, 2.626790e-08}, + {30, 60, 3, 4, 18, 42, 2, 0.498513, 1.485240e-08}, + {31, 48, 3, 4, 18, 18, 1, 0.546238, 1.267290e-08}, + {32, 52, 3, 4, 26, 26, 1, 0.546238, 9.891110e-09}, + {33, 60, 3, 4, 18, 30, 2, 0.546238, 9.019200e-09}, + {34, 48, 3, 4, 16, 32, 1, 0.546238, 8.762650e-09}, + {35, 52, 3, 4, 24, 24, 1, 0.546238, 8.213140e-09}, + {36, 56, 3, 4, 16, 42, 2, 0.546238, 6.658250e-09}, + {37, 52, 3, 4, 22, 22, 1, 0.546238, 4.856960e-09}, + {38, 48, 3, 4, 16, 16, 1, 0.546238, 4.381330e-09}, + {39, 56, 3, 4, 16, 28, 2, 0.546238, 4.068000e-09}, + {40, 60, 3, 4, 30, 30, 1, 0.546238, 3.186040e-09}, + {41, 60, 3, 4, 28, 28, 1, 0.578290, 2.725470e-09}, + {42, 64, 3, 4, 18, 46, 2, 0.578290, 2.410890e-09}, + {43, 52, 3, 4, 20, 20, 1, 0.578290, 2.181360e-09}, + {44, 60, 3, 4, 26, 26, 1, 0.578290, 1.737940e-09}, + {45, 52, 3, 4, 18, 34, 1, 0.578290, 1.595330e-09}, + {46, 56, 3, 4, 28, 28, 1, 0.578290, 1.481830e-09}, + {47, 64, 3, 4, 18, 32, 2, 0.578290, 1.454780e-09}, + {48, 56, 3, 4, 26, 26, 1, 0.578290, 1.250550e-09}, + {49, 60, 3, 4, 24, 24, 1, 0.578290, 8.614860e-10}, + {50, 52, 3, 4, 18, 18, 1, 0.578290, 7.976650e-10}, + {51, 56, 3, 4, 24, 24, 1, 0.628015, 7.700380e-10}, + {52, 60, 3, 4, 22, 38, 1, 0.628015, 6.978800e-10}, + {53, 52, 3, 4, 16, 36, 1, 0.628015, 5.069080e-10}, + {54, 64, 3, 4, 32, 32, 1, 0.628015, 4.986660e-10}, + {55, 64, 3, 4, 30, 30, 1, 0.628015, 4.315180e-10}, + {56, 68, 3, 4, 18, 50, 2, 0.628015, 3.848530e-10}, + {57, 56, 3, 4, 22, 22, 1, 0.628015, 3.643130e-10}, + {58, 60, 3, 4, 22, 22, 1, 0.628015, 3.489400e-10}, + {59, 64, 3, 4, 28, 28, 1, 0.628015, 2.836780e-10}, + {60, 56, 3, 4, 20, 36, 1, 0.628015, 2.809120e-10}, + {61, 52, 3, 4, 16, 16, 1, 0.666500, 2.534540e-10}, + {62, 60, 3, 4, 20, 40, 1, 0.666500, 2.427110e-10}, + {63, 68, 3, 4, 18, 34, 2, 0.666500, 2.309280e-10}, + {64, 64, 3, 4, 26, 26, 1, 0.666500, 1.466250e-10}, + {65, 56, 3, 4, 20, 20, 1, 0.666500, 1.404560e-10}, + {66, 76, 3, 4, 22, 54, 2, 0.666500, 1.375500e-10}, + {67, 60, 3, 4, 20, 20, 1, 0.666500, 1.213550e-10}, + {68, 56, 3, 4, 18, 38, 1, 0.666500, 9.340240e-11}, + {69, 76, 3, 4, 22, 38, 2, 0.666500, 8.174200e-11}, + {70, 68, 3, 4, 34, 34, 1, 0.666500, 7.700290e-11}, + {71, 68, 3, 4, 32, 32, 1, 0.666500, 6.729690e-11}, + {72, 64, 3, 4, 24, 24, 1, 0.706860, 6.217280e-11}, + {73, 72, 3, 4, 18, 56, 2, 0.706860, 6.056200e-11}, + {74, 56, 3, 4, 18, 18, 1, 0.706860, 4.670120e-11}, + {75, 68, 3, 4, 30, 30, 1, 0.706860, 4.543980e-11}, + {76, 64, 3, 4, 22, 42, 1, 0.706860, 4.517330e-11}, + {77, 72, 3, 4, 18, 36, 2, 0.706860, 3.615450e-11}, + {78, 76, 3, 4, 38, 38, 1, 0.706860, 2.593400e-11}, + {79, 68, 3, 4, 28, 28, 1, 0.706860, 2.438720e-11}, + {80, 76, 3, 4, 36, 36, 1, 0.706860, 2.303460e-11}, + {81, 64, 3, 4, 22, 22, 1, 0.706860, 2.258660e-11}, + {82, 80, 3, 4, 22, 58, 2, 0.706860, 2.229400e-11}, + {83, 76, 3, 4, 34, 34, 1, 0.706860, 1.626350e-11}, + {84, 64, 3, 4, 20, 40, 1, 0.706860, 1.465310e-11}, + {85, 80, 3, 4, 22, 40, 2, 0.763542, 1.319160e-11}, + {86, 72, 3, 4, 36, 36, 1, 0.763542, 1.174900e-11}, + {87, 68, 3, 4, 26, 26, 1, 0.763542, 1.078820e-11}, + {88, 72, 3, 4, 34, 34, 1, 0.763542, 1.035690e-11}, + {89, 76, 3, 4, 32, 32, 1, 0.763542, 9.311370e-12}, + {90, 68, 3, 4, 24, 44, 1, 0.763542, 8.173020e-12}, + {91, 64, 3, 4, 20, 20, 1, 0.763542, 7.326570e-12}, + {92, 72, 3, 4, 32, 32, 1, 0.763542, 7.160350e-12}, + {93, 76, 3, 4, 30, 30, 1, 0.763542, 4.440960e-12}, + {94, 80, 3, 4, 40, 40, 1, 0.763542, 4.089220e-12}, + {95, 68, 3, 4, 24, 24, 1, 0.763542, 4.086510e-12}, + {96, 72, 3, 4, 30, 30, 1, 0.763542, 3.975570e-12}, + {97, 80, 3, 4, 38, 38, 1, 0.763542, 3.656430e-12}, + {98, 76, 3, 4, 28, 48, 1, 0.763542, 3.634830e-12}, + {99, 84, 3, 4, 22, 62, 2, 0.763542, 3.566880e-12}, + {100, 68, 3, 4, 22, 46, 1, 0.783762, 2.750600e-12}, + {101, 80, 3, 4, 36, 36, 1, 0.783762, 2.630600e-12}, + {102, 84, 3, 4, 22, 42, 2, 0.783762, 2.102180e-12}, + {103, 72, 3, 4, 28, 28, 1, 0.783762, 1.828850e-12}, + {104, 76, 3, 4, 28, 28, 1, 0.783762, 1.817420e-12}, + {105, 80, 3, 4, 34, 34, 1, 0.783762, 1.548670e-12}, + {106, 72, 3, 4, 26, 46, 1, 0.783762, 1.441670e-12}, + {107, 68, 3, 4, 22, 22, 1, 0.783762, 1.375300e-12}, + {108, 76, 3, 4, 26, 50, 1, 0.783762, 1.314800e-12}, + {109, 92, 3, 4, 24, 68, 2, 0.783762, 1.296220e-12}, + {110, 68, 3, 4, 20, 48, 1, 0.783762, 8.516070e-13}, + {111, 80, 3, 4, 32, 32, 1, 0.783762, 7.636740e-13}, + {112, 92, 3, 4, 24, 46, 2, 0.783762, 7.585130e-13}, + {113, 72, 3, 4, 26, 26, 1, 0.824961, 7.208340e-13}, + {114, 76, 3, 4, 26, 26, 1, 0.824961, 6.573980e-13}, + {115, 80, 3, 4, 30, 50, 1, 0.824961, 6.475910e-13}, + {116, 84, 3, 4, 42, 42, 1, 0.824961, 6.374900e-13}, + {117, 84, 3, 4, 40, 40, 1, 0.824961, 5.734350e-13}, + {118, 88, 3, 4, 22, 66, 2, 0.824961, 5.640630e-13}, + {119, 72, 3, 4, 24, 48, 1, 0.824961, 5.032200e-13}, + {120, 76, 3, 4, 24, 52, 1, 0.824961, 4.325430e-13}, + {121, 68, 3, 4, 20, 20, 1, 0.824961, 4.258030e-13}, + {122, 84, 3, 4, 38, 38, 1, 0.824961, 4.195890e-13}, + {123, 88, 3, 4, 22, 44, 2, 0.824961, 3.312130e-13}, + {124, 80, 3, 4, 30, 30, 1, 0.824961, 3.237950e-13}, + {125, 84, 3, 4, 36, 36, 1, 0.824961, 2.533670e-13}, + {126, 72, 3, 4, 24, 24, 1, 0.824961, 2.516100e-13}, + {127, 80, 3, 4, 28, 52, 1, 0.824961, 2.424700e-13}, + {128, 92, 3, 4, 46, 46, 1, 0.865704, 2.208090e-13}, + {129, 76, 3, 4, 24, 24, 1, 0.865704, 2.162710e-13}, + {130, 96, 3, 4, 26, 72, 2, 0.865704, 2.099840e-13}, + {131, 92, 3, 4, 44, 44, 1, 0.865704, 2.006580e-13}, + {132, 72, 3, 4, 22, 50, 1, 0.865704, 1.605310e-13}, + {133, 92, 3, 4, 42, 42, 1, 0.865704, 1.511670e-13}, + {134, 84, 3, 4, 34, 34, 1, 0.865704, 1.288510e-13}, + {135, 96, 3, 4, 26, 48, 2, 0.865704, 1.224810e-13}, + {136, 80, 3, 4, 28, 28, 1, 0.865704, 1.212350e-13}, + {137, 88, 3, 4, 44, 44, 1, 0.865704, 9.836240e-14}, + {138, 92, 3, 4, 40, 40, 1, 0.865704, 9.542830e-14}, + {139, 88, 3, 4, 42, 42, 1, 0.865704, 8.895450e-14}, + {140, 80, 3, 4, 26, 54, 1, 0.865704, 8.227740e-14}, + {141, 72, 3, 4, 22, 22, 1, 0.865704, 8.026550e-14}, + {142, 88, 3, 4, 40, 40, 1, 0.865704, 6.609120e-14}, + {143, 84, 3, 4, 32, 32, 1, 0.865704, 5.648410e-14}, + {144, 92, 3, 4, 38, 38, 1, 0.908949, 5.127400e-14}, + {145, 72, 3, 4, 20, 52, 1, 0.908949, 4.822030e-14}, + {146, 84, 3, 4, 30, 54, 1, 0.908949, 4.372420e-14}, + {147, 80, 3, 4, 26, 26, 1, 0.908949, 4.113870e-14}, + {148, 88, 3, 4, 38, 38, 1, 0.908949, 4.084490e-14}, + {149, 96, 3, 4, 48, 48, 1, 0.908949, 3.497970e-14}, + {150, 100, 3, 4, 26, 76, 2, 0.908949, 3.365420e-14}, + {151, 96, 3, 4, 46, 46, 1, 0.908949, 3.192740e-14}, + {152, 80, 3, 4, 24, 56, 1, 0.908949, 2.593890e-14}, + {153, 96, 3, 4, 44, 44, 1, 0.908949, 2.435890e-14}, + {154, 72, 3, 4, 20, 20, 1, 0.908949, 2.411020e-14}, + {155, 92, 3, 4, 36, 36, 1, 0.908949, 2.388460e-14}, + {156, 84, 3, 4, 30, 30, 1, 0.908949, 2.186210e-14}, + {157, 88, 3, 4, 36, 36, 1, 0.908949, 2.137330e-14}, + {158, 92, 3, 4, 34, 58, 1, 0.908949, 1.967320e-14}, + {159, 100, 3, 4, 26, 50, 2, 0.908949, 1.957080e-14}, + {160, 96, 3, 4, 42, 42, 1, 0.908949, 1.568040e-14}, + {161, 84, 3, 4, 28, 56, 1, 0.908949, 1.529960e-14}, + {162, 80, 3, 4, 24, 24, 1, 0.954202, 1.296950e-14}, + {163, 108, 3, 4, 28, 82, 2, 0.954202, 1.237200e-14}, + {164, 92, 3, 4, 34, 34, 1, 0.954202, 9.836600e-15}, + {165, 88, 3, 4, 34, 34, 1, 0.954202, 9.667440e-15}, + {166, 96, 3, 4, 40, 40, 1, 0.954202, 8.634600e-15}, + {167, 88, 3, 4, 32, 56, 1, 0.954202, 7.725050e-15}, + {168, 84, 3, 4, 28, 28, 1, 0.954202, 7.649800e-15}, + {169, 92, 3, 4, 32, 60, 1, 0.954202, 7.305750e-15}, + {170, 108, 3, 4, 28, 54, 2, 0.954202, 7.154920e-15}, + {171, 100, 3, 4, 50, 50, 1, 0.954202, 5.487490e-15}, + {172, 104, 3, 4, 26, 78, 2, 0.954202, 5.340690e-15}, + {173, 100, 3, 4, 48, 48, 1, 0.954202, 5.028760e-15}, + {174, 84, 3, 4, 26, 58, 1, 0.954202, 4.951260e-15}, + {175, 96, 3, 4, 38, 38, 1, 0.954202, 4.134930e-15}, + {176, 100, 3, 4, 46, 46, 1, 0.954202, 3.881360e-15}, + {177, 88, 3, 4, 32, 32, 1, 0.954202, 3.862530e-15}, + {178, 92, 3, 4, 32, 32, 1, 0.954202, 3.652870e-15}, + {179, 96, 3, 4, 36, 60, 1, 0.954202, 3.505650e-15}, + {180, 104, 3, 4, 26, 52, 2, 0.993877, 3.096920e-15}, + {181, 88, 3, 4, 30, 58, 1, 0.993877, 2.785770e-15}, + {182, 100, 3, 4, 44, 44, 1, 0.993877, 2.543880e-15}, + {183, 92, 3, 4, 30, 62, 1, 0.993877, 2.493880e-15}, + {184, 84, 3, 4, 26, 26, 1, 0.993877, 2.475630e-15}, + {185, 112, 3, 4, 28, 86, 2, 0.993877, 2.003890e-15}, + {186, 108, 3, 4, 54, 54, 1, 0.993877, 1.937830e-15}, + {187, 108, 3, 4, 52, 52, 1, 0.993877, 1.788370e-15}, + {188, 96, 3, 4, 36, 36, 1, 0.993877, 1.752820e-15}, + {189, 84, 3, 4, 24, 60, 1, 0.993877, 1.514630e-15}, + {190, 100, 3, 4, 42, 42, 1, 0.993877, 1.433180e-15}, + {191, 108, 3, 4, 50, 50, 1, 0.993877, 1.408830e-15}, + {192, 88, 3, 4, 30, 30, 1, 0.993877, 1.392880e-15}, + {193, 96, 3, 4, 34, 62, 1, 0.993877, 1.339400e-15}, + {194, 92, 3, 4, 30, 30, 1, 0.993877, 1.246940e-15}, + {195, 112, 3, 4, 28, 56, 2, 0.993877, 1.155930e-15}, + {196, 108, 3, 4, 48, 48, 1, 0.993877, 9.534230e-16}, + {197, 88, 3, 4, 28, 60, 1, 0.993877, 9.258750e-16}, + {198, 104, 3, 4, 52, 52, 1, 1.035782, 8.531480e-16}, + {199, 92, 3, 4, 28, 64, 1, 1.035782, 7.972240e-16}, + {200, 104, 3, 4, 50, 50, 1, 1.035782, 7.847010e-16}, + {201, 84, 3, 4, 24, 24, 1, 1.035782, 7.573130e-16}, + {202, 100, 3, 4, 40, 40, 1, 1.035782, 7.043820e-16}, + {203, 96, 3, 4, 34, 34, 1, 1.035782, 6.696990e-16}, + {204, 100, 3, 4, 38, 62, 1, 1.035782, 6.138180e-16}, + {205, 104, 3, 4, 48, 48, 1, 1.035782, 6.121340e-16}, + {206, 108, 3, 4, 46, 46, 1, 1.035782, 5.596910e-16}, + {207, 96, 3, 4, 32, 64, 1, 1.035782, 4.694950e-16}, + {208, 88, 3, 4, 28, 28, 1, 1.035782, 4.629380e-16}, + {209, 104, 3, 4, 46, 46, 1, 1.035782, 4.079260e-16}, + {210, 92, 3, 4, 28, 28, 1, 1.035782, 3.986120e-16}, + {211, 116, 3, 4, 30, 86, 2, 1.035782, 3.215820e-16}, + {212, 112, 3, 4, 56, 56, 1, 1.035782, 3.079780e-16}, + {213, 100, 3, 4, 38, 38, 1, 1.035782, 3.069090e-16}, + {214, 88, 3, 4, 26, 62, 1, 1.035782, 2.893730e-16}, + {215, 108, 3, 4, 44, 44, 1, 1.035782, 2.884350e-16}, + {216, 112, 3, 4, 54, 54, 1, 1.035782, 2.851100e-16}, + {217, 92, 3, 4, 26, 66, 1, 1.035782, 2.429760e-16}, + {218, 100, 3, 4, 36, 64, 1, 1.083752, 2.410500e-16}, + {219, 104, 3, 4, 44, 44, 1, 1.083752, 2.347600e-16}, + {220, 96, 3, 4, 32, 32, 1, 1.083752, 2.347480e-16}, + {221, 112, 3, 4, 52, 52, 1, 1.083752, 2.266460e-16}, + {222, 116, 3, 4, 30, 58, 2, 1.083752, 1.850560e-16}, + {223, 112, 3, 4, 50, 50, 1, 1.083752, 1.555940e-16}, + {224, 96, 3, 4, 30, 66, 1, 1.083752, 1.536060e-16}, + {225, 88, 3, 4, 26, 26, 1, 1.083752, 1.446860e-16}, + {226, 108, 3, 4, 42, 42, 1, 1.083752, 1.322410e-16}, + {227, 92, 3, 4, 26, 26, 1, 1.083752, 1.214880e-16}, + {228, 100, 3, 4, 36, 36, 1, 1.083752, 1.205250e-16}, + {229, 124, 3, 4, 32, 94, 2, 1.083752, 1.192380e-16}, + {230, 104, 3, 4, 42, 42, 1, 1.083752, 1.182330e-16}, + {231, 108, 3, 4, 40, 68, 1, 1.083752, 1.093900e-16}, + {232, 112, 3, 4, 48, 48, 1, 1.083752, 9.304980e-17}, + {233, 100, 3, 4, 34, 66, 1, 1.083752, 8.672750e-17}, + {234, 88, 3, 4, 24, 64, 1, 1.083752, 8.671340e-17}, + {235, 96, 3, 4, 30, 30, 1, 1.083752, 7.680300e-17}, + {236, 124, 3, 4, 32, 62, 2, 1.083752, 6.831000e-17}, + {237, 108, 3, 4, 40, 40, 1, 1.083752, 5.469510e-17}, + {238, 104, 3, 4, 40, 40, 1, 1.083752, 5.287900e-17}, + {239, 120, 3, 4, 30, 90, 2, 1.122176, 5.116510e-17}, + {240, 112, 3, 4, 46, 46, 1, 1.122176, 4.900210e-17}, + {241, 116, 3, 4, 58, 58, 1, 1.122176, 4.853020e-17}, + {242, 96, 3, 4, 28, 68, 1, 1.122176, 4.769400e-17}, + {243, 116, 3, 4, 56, 56, 1, 1.122176, 4.505610e-17}, + {244, 100, 3, 4, 34, 34, 1, 1.122176, 4.336370e-17}, + {245, 88, 3, 4, 24, 24, 1, 1.122176, 4.335670e-17}, + {246, 104, 3, 4, 38, 66, 1, 1.122176, 4.264440e-17}, + {247, 108, 3, 4, 38, 70, 1, 1.122176, 4.139190e-17}, + {248, 116, 3, 4, 54, 54, 1, 1.122176, 3.611940e-17}, + {249, 120, 3, 4, 30, 60, 2, 1.122176, 2.937590e-17}, + {250, 100, 3, 4, 32, 68, 1, 1.122176, 2.904870e-17}, + {251, 116, 3, 4, 52, 52, 1, 1.122176, 2.512890e-17}, + {252, 96, 3, 4, 28, 28, 1, 1.122176, 2.384700e-17}, + {253, 112, 3, 4, 44, 44, 1, 1.122176, 2.300220e-17}, + {254, 104, 3, 4, 38, 38, 1, 1.122176, 2.132220e-17}, + {255, 108, 3, 4, 38, 38, 1, 1.122176, 2.069600e-17}, + {256, 112, 3, 4, 42, 70, 1, 1.122176, 1.949710e-17}, + {257, 128, 3, 4, 32, 98, 2, 1.122176, 1.931040e-17}, + {258, 124, 3, 4, 62, 62, 1, 1.122176, 1.738220e-17}, + {259, 124, 3, 4, 60, 60, 1, 1.122176, 1.622110e-17}, + {260, 104, 3, 4, 36, 68, 1, 1.165058, 1.573970e-17}, + {261, 116, 3, 4, 50, 50, 1, 1.165058, 1.529120e-17}, + {262, 108, 3, 4, 36, 72, 1, 1.165058, 1.452810e-17}, + {263, 100, 3, 4, 32, 32, 1, 1.165058, 1.452430e-17}, + {264, 124, 3, 4, 58, 58, 1, 1.165058, 1.320160e-17}, + {265, 128, 3, 4, 32, 64, 2, 1.165058, 1.103980e-17}, + {266, 112, 3, 4, 42, 42, 1, 1.165058, 9.748530e-18}, + {267, 124, 3, 4, 56, 56, 1, 1.165058, 9.408340e-18}, + {268, 100, 3, 4, 30, 70, 1, 1.165058, 9.198900e-18}, + {269, 116, 3, 4, 48, 48, 1, 1.165058, 8.218710e-18}, + {270, 104, 3, 4, 36, 36, 1, 1.165058, 7.869870e-18}, + {271, 120, 3, 4, 60, 60, 1, 1.165058, 7.586620e-18}, + {272, 112, 3, 4, 40, 72, 1, 1.165058, 7.557840e-18}, + {273, 108, 3, 4, 36, 36, 1, 1.165058, 7.264050e-18}, + {274, 120, 3, 4, 58, 58, 1, 1.165058, 7.062330e-18}, + {275, 124, 3, 4, 54, 54, 1, 1.165058, 5.908890e-18}, + {276, 120, 3, 4, 56, 56, 1, 1.165058, 5.705970e-18}, + {277, 104, 3, 4, 34, 70, 1, 1.165058, 5.397190e-18}, + {278, 108, 3, 4, 34, 74, 1, 1.165058, 4.794130e-18}, + {279, 100, 3, 4, 30, 30, 1, 1.165058, 4.599450e-18}, + {280, 120, 3, 4, 54, 54, 1, 1.165058, 4.019430e-18}, + {281, 116, 3, 4, 46, 46, 1, 1.165058, 3.945320e-18}, + {282, 112, 3, 4, 40, 40, 1, 1.165058, 3.778920e-18}, + {283, 116, 3, 4, 44, 72, 1, 1.231412, 3.423190e-18}, + {284, 124, 3, 4, 52, 52, 1, 1.231412, 3.297090e-18}, + {285, 100, 3, 4, 28, 72, 1, 1.231412, 2.795780e-18}, + {286, 128, 3, 4, 64, 64, 1, 1.231412, 2.769110e-18}, + {287, 112, 3, 4, 38, 74, 1, 1.231412, 2.714430e-18}, + {288, 104, 3, 4, 34, 34, 1, 1.231412, 2.698600e-18}, + {289, 128, 3, 4, 62, 62, 1, 1.231412, 2.590140e-18}, + {290, 120, 3, 4, 52, 52, 1, 1.231412, 2.486040e-18}, + {291, 108, 3, 4, 34, 34, 1, 1.231412, 2.397060e-18}, + {292, 128, 3, 4, 60, 60, 1, 1.231412, 2.122380e-18}, + {293, 104, 3, 4, 32, 72, 1, 1.231412, 1.744360e-18}, + {294, 116, 3, 4, 44, 44, 1, 1.231412, 1.711600e-18}, + {295, 124, 3, 4, 50, 50, 1, 1.231412, 1.649820e-18}, + {296, 128, 3, 4, 58, 58, 1, 1.231412, 1.529130e-18}, + {297, 108, 3, 4, 32, 76, 1, 1.231412, 1.506960e-18}, + {298, 100, 3, 4, 28, 28, 1, 1.231412, 1.397890e-18}, + {299, 120, 3, 4, 50, 50, 1, 1.231412, 1.362180e-18}, + {300, 116, 3, 4, 42, 74, 1, 1.231412, 1.358390e-18}, + {301, 112, 3, 4, 38, 38, 1, 1.231412, 1.357210e-18}, + {302, 128, 3, 4, 56, 56, 1, 1.231412, 9.742990e-19}, + {303, 112, 3, 4, 36, 76, 1, 1.231412, 9.147070e-19}, + {304, 104, 3, 4, 32, 32, 1, 1.231412, 8.721800e-19}, + {305, 108, 3, 4, 32, 32, 1, 1.231412, 7.534800e-19}, + {306, 124, 3, 4, 48, 48, 1, 1.273354, 7.478050e-19}, + {307, 116, 3, 4, 42, 42, 1, 1.273354, 6.791960e-19}, + {308, 120, 3, 4, 48, 48, 1, 1.273354, 6.679650e-19}, + {309, 124, 3, 4, 46, 78, 1, 1.273354, 6.204930e-19}, + {310, 120, 3, 4, 46, 74, 1, 1.273354, 5.926870e-19}, + {311, 128, 3, 4, 54, 54, 1, 1.273354, 5.530780e-19}, + {312, 104, 3, 4, 30, 74, 1, 1.273354, 5.388680e-19}, + {313, 116, 3, 4, 40, 76, 1, 1.273354, 4.990110e-19}, + {314, 112, 3, 4, 36, 36, 1, 1.273354, 4.573530e-19}, + {315, 108, 3, 4, 30, 78, 1, 1.273354, 4.570100e-19}, + {316, 124, 3, 4, 46, 46, 1, 1.273354, 3.102460e-19}, + {317, 120, 3, 4, 46, 46, 1, 1.273354, 2.963440e-19}, + {318, 112, 3, 4, 34, 78, 1, 1.273354, 2.927770e-19}, + {319, 128, 3, 4, 52, 52, 1, 1.273354, 2.821290e-19}, + {320, 104, 3, 4, 30, 30, 1, 1.273354, 2.694340e-19}, + {321, 116, 3, 4, 40, 40, 1, 1.273354, 2.495060e-19}, + {322, 120, 3, 4, 44, 76, 1, 1.273354, 2.405750e-19}, + {323, 124, 3, 4, 44, 80, 1, 1.273354, 2.381080e-19}, + {324, 108, 3, 4, 30, 30, 1, 1.273354, 2.285050e-19}, + {325, 116, 3, 4, 38, 78, 1, 1.273354, 1.717170e-19}, + {326, 104, 3, 4, 28, 76, 1, 1.273354, 1.613020e-19}, + {327, 112, 3, 4, 34, 34, 1, 1.273354, 1.463890e-19}, + {328, 128, 3, 4, 50, 50, 1, 1.273354, 1.305320e-19}, + {329, 120, 3, 4, 44, 44, 1, 1.273354, 1.202870e-19}, + {330, 124, 3, 4, 44, 44, 1, 1.273354, 1.190540e-19}, + {331, 128, 3, 4, 48, 80, 1, 1.307736, 1.106170e-19}, + {332, 120, 3, 4, 42, 78, 1, 1.307736, 9.035000e-20}, + {333, 112, 3, 4, 32, 80, 1, 1.307736, 9.008150e-20}, + {334, 116, 3, 4, 38, 38, 1, 1.307736, 8.585840e-20}, + {335, 124, 3, 4, 42, 82, 1, 1.307736, 8.539640e-20}, + {336, 104, 3, 4, 28, 28, 1, 1.307736, 8.065090e-20}, + {337, 116, 3, 4, 36, 80, 1, 1.307736, 5.599310e-20}, + {338, 128, 3, 4, 48, 48, 1, 1.307736, 5.530870e-20}, + {339, 120, 3, 4, 42, 42, 1, 1.307736, 4.517500e-20}, + {340, 112, 3, 4, 32, 32, 1, 1.307736, 4.504080e-20}, + {341, 128, 3, 4, 46, 82, 1, 1.307736, 4.334810e-20}, + {342, 124, 3, 4, 42, 42, 1, 1.307736, 4.269820e-20}, + {343, 120, 3, 4, 40, 80, 1, 1.307736, 3.174430e-20}, + {344, 124, 3, 4, 40, 84, 1, 1.307736, 2.891760e-20}, + {345, 116, 3, 4, 36, 36, 1, 1.307736, 2.799660e-20}, + {346, 112, 3, 4, 30, 82, 1, 1.307736, 2.695640e-20}, + {347, 128, 3, 4, 46, 46, 1, 1.307736, 2.167410e-20}, + {348, 116, 3, 4, 34, 82, 1, 1.307736, 1.749650e-20}, + {349, 120, 3, 4, 40, 40, 1, 1.307736, 1.587220e-20}, + {350, 128, 3, 4, 44, 84, 1, 1.307736, 1.586440e-20}, + {351, 124, 3, 4, 40, 40, 1, 1.307736, 1.445880e-20}, + {352, 112, 3, 4, 30, 30, 1, 1.307736, 1.347820e-20}, + {353, 120, 3, 4, 38, 82, 1, 1.307736, 1.054790e-20}, + {354, 124, 3, 4, 38, 86, 1, 1.307736, 9.338320e-21}, + {355, 116, 3, 4, 34, 34, 1, 1.345734, 8.748240e-21}, + {356, 128, 3, 4, 44, 44, 1, 1.345734, 7.932220e-21}, + {357, 128, 3, 4, 42, 86, 1, 1.345734, 5.474680e-21}, + {358, 116, 3, 4, 32, 84, 1, 1.345734, 5.297010e-21}, + {359, 120, 3, 4, 38, 38, 1, 1.345734, 5.273960e-21}, + {360, 124, 3, 4, 38, 38, 1, 1.345734, 4.669160e-21}, + {361, 120, 3, 4, 36, 84, 1, 1.345734, 3.349800e-21}, + {362, 124, 3, 4, 36, 88, 1, 1.345734, 2.903950e-21}, + {363, 128, 3, 4, 42, 42, 1, 1.345734, 2.737340e-21}, + {364, 116, 3, 4, 32, 32, 1, 1.345734, 2.648510e-21}, + {365, 128, 3, 4, 40, 88, 1, 1.345734, 1.798290e-21}, + {366, 120, 3, 4, 36, 36, 1, 1.345734, 1.674900e-21}, + {367, 124, 3, 4, 36, 36, 1, 1.345734, 1.451970e-21}, + {368, 120, 3, 4, 34, 86, 1, 1.345734, 1.027330e-21}, + {369, 128, 3, 4, 40, 40, 1, 1.345734, 8.991430e-22}, + {370, 124, 3, 4, 34, 90, 1, 1.345734, 8.779540e-22}, + {371, 128, 3, 4, 38, 90, 1, 1.345734, 5.674390e-22}, + {372, 120, 3, 4, 34, 34, 1, 1.345734, 5.136640e-22}, + {373, 124, 3, 4, 34, 34, 1, 1.345734, 4.389770e-22}, + {374, 120, 3, 4, 32, 88, 1, 1.345734, 3.073590e-22}, + {375, 128, 3, 4, 38, 38, 1, 1.345734, 2.837200e-22}, + {376, 128, 3, 4, 36, 92, 1, 1.345734, 1.735640e-22}, + {377, 120, 3, 4, 32, 32, 1, 1.345734, 1.536800e-22}, + {378, 128, 3, 4, 36, 36, 1, 1.345734, 8.678180e-23}, + {379, 128, 3, 4, 34, 94, 1, 1.345734, 5.192020e-23}, + {380, 128, 3, 4, 34, 34, 1, 1.345734, 2.600000e-23}, + +} + +/* +// Table is difficulty table slice +var Table = []difficulty{ + {0, 32, 3, 4, 8, 24, 2, 0.329111, 3.077970e-05}, + {1, 36, 3, 4, 9, 27, 2, 0.329111, 3.077970e-05}, + {2, 40, 3, 4, 10, 30, 2, 0.329111, 2.023220e-05}, + {3, 44, 3, 4, 11, 33, 1, 0.329111, 9.684650e-06}, + {4, 48, 3, 4, 12, 36, 1, 0.329111, 6.784080e-06}, + {5, 52, 3, 4, 13, 39, 2, 0.329111, 4.830240e-06}, + {6, 56, 3, 4, 14, 42, 2, 0.369449, 3.125970e-06}, + {7, 60, 3, 4, 15, 45, 1, 0.369449, 2.862890e-06}, + {8, 64, 3, 4, 16, 48, 2, 0.369449, 1.637790e-06}, + {9, 68, 3, 4, 17, 51, 1, 0.369449, 1.421700e-06}, + {10, 72, 3, 4, 18, 54, 1, 0.369449, 1.051350e-06}, + {11, 76, 3, 4, 19, 57, 2, 0.411046, 1.029740e-06}, + {12, 80, 3, 4, 20, 60, 2, 0.411046, 7.570880e-07}, + {13, 84, 3, 4, 21, 63, 1, 0.411046, 4.865630e-07}, + {14, 88, 3, 4, 22, 66, 2, 0.411046, 4.813320e-07}, + {15, 92, 3, 4, 23, 69, 1, 0.411046, 4.216920e-07}, + {16, 96, 3, 4, 24, 72, 1, 0.411046, 3.350070e-07}, + {17, 100, 3, 4, 25, 75, 2, 0.452453, 2.677070e-07}, + {18, 104, 3, 4, 26, 78, 1, 0.452453, 2.055750e-07}, + {19, 108, 3, 4, 27, 81, 1, 0.452453, 1.788400e-07}, + {20, 112, 3, 4, 28, 84, 2, 0.452453, 1.664080e-07}, + {21, 116, 3, 4, 29, 87, 1, 0.452453, 1.583110e-07}, + {22, 120, 3, 4, 30, 90, 1, 0.452453, 7.917230e-08}, + {23, 124, 3, 4, 31, 93, 1, 0.498513, 7.103820e-08}, + {24, 128, 3, 4, 32, 96, 1, 0.498513, 6.510890e-08}, + {25, 132, 3, 4, 33, 99, 1, 0.498513, 5.300760e-08}, + {26, 136, 3, 4, 34, 102, 2, 0.498513, 4.266600e-08}, + {27, 140, 3, 4, 35, 105, 1, 0.498513, 2.990510e-08}, + {28, 144, 3, 4, 36, 108, 1, 0.498513, 2.927380e-08}, + {29, 148, 3, 4, 37, 111, 2, 0.498513, 2.626790e-08}, + {30, 152, 3, 4, 38, 114, 2, 0.498513, 1.485240e-08}, + {31, 156, 3, 4, 39, 117, 1, 0.546238, 1.267290e-08}, + {32, 160, 3, 4, 40, 120, 1, 0.546238, 9.891110e-09}, + {33, 164, 3, 4, 41, 123, 2, 0.546238, 9.019200e-09}, + {34, 168, 3, 4, 42, 126, 1, 0.546238, 8.762650e-09}, + {35, 172, 3, 4, 43, 129, 1, 0.546238, 8.213140e-09}, + {36, 176, 3, 4, 44, 132, 2, 0.546238, 6.658250e-09}, + {37, 180, 3, 4, 45, 135, 1, 0.546238, 4.856960e-09}, + {38, 184, 3, 4, 46, 138, 1, 0.546238, 4.381330e-09}, + {39, 188, 3, 4, 47, 141, 2, 0.546238, 4.068000e-09}, + {40, 192, 3, 4, 48, 144, 1, 0.546238, 3.186040e-09}, + {41, 196, 3, 4, 49, 147, 1, 0.578290, 2.725470e-09}, + {42, 200, 3, 4, 50, 150, 2, 0.578290, 2.410890e-09}, + {43, 204, 3, 4, 51, 153, 1, 0.578290, 2.181360e-09}, + {44, 208, 3, 4, 52, 156, 1, 0.578290, 1.737940e-09}, + {45, 212, 3, 4, 53, 159, 1, 0.578290, 1.595330e-09}, + {46, 216, 3, 4, 54, 162, 1, 0.578290, 1.481830e-09}, + {47, 220, 3, 4, 55, 165, 2, 0.578290, 1.454780e-09}, + {48, 224, 3, 4, 56, 168, 1, 0.578290, 1.250550e-09}, + {49, 228, 3, 4, 57, 171, 1, 0.578290, 8.614860e-10}, + {50, 232, 3, 4, 58, 174, 1, 0.578290, 7.976650e-10}, + {51, 236, 3, 4, 59, 177, 1, 0.628015, 7.700380e-10}, + {52, 240, 3, 4, 60, 180, 1, 0.628015, 6.978800e-10}, + {53, 244, 3, 4, 61, 183, 1, 0.628015, 5.069080e-10}, + {54, 248, 3, 4, 62, 186, 1, 0.628015, 4.986660e-10}, + {55, 252, 3, 4, 63, 189, 1, 0.628015, 4.315180e-10}, + {56, 256, 3, 4, 64, 192, 2, 0.628015, 3.848530e-10}, +}*/ +