vendor: Add dependencies for discosrv
This commit is contained in:
27
vendor/github.com/cznic/mathutil/LICENSE
generated
vendored
Normal file
27
vendor/github.com/cznic/mathutil/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the names of the authors nor the names of the
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
207
vendor/github.com/cznic/mathutil/bits.go
generated
vendored
Normal file
207
vendor/github.com/cznic/mathutil/bits.go
generated
vendored
Normal file
@@ -0,0 +1,207 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
)
|
||||
|
||||
// BitLenByte returns the bit width of the non zero part of n.
|
||||
func BitLenByte(n byte) int {
|
||||
return log2[n] + 1
|
||||
}
|
||||
|
||||
// BitLenUint16 returns the bit width of the non zero part of n.
|
||||
func BitLenUint16(n uint16) int {
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8 + 1
|
||||
}
|
||||
|
||||
return log2[n] + 1
|
||||
}
|
||||
|
||||
// BitLenUint32 returns the bit width of the non zero part of n.
|
||||
func BitLenUint32(n uint32) int {
|
||||
if b := n >> 24; b != 0 {
|
||||
return log2[b] + 24 + 1
|
||||
}
|
||||
|
||||
if b := n >> 16; b != 0 {
|
||||
return log2[b] + 16 + 1
|
||||
}
|
||||
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8 + 1
|
||||
}
|
||||
|
||||
return log2[n] + 1
|
||||
}
|
||||
|
||||
// BitLen returns the bit width of the non zero part of n.
|
||||
func BitLen(n int) int { // Should handle correctly [future] 64 bit Go ints
|
||||
if IntBits == 64 {
|
||||
return BitLenUint64(uint64(n))
|
||||
}
|
||||
|
||||
if b := byte(n >> 24); b != 0 {
|
||||
return log2[b] + 24 + 1
|
||||
}
|
||||
|
||||
if b := byte(n >> 16); b != 0 {
|
||||
return log2[b] + 16 + 1
|
||||
}
|
||||
|
||||
if b := byte(n >> 8); b != 0 {
|
||||
return log2[b] + 8 + 1
|
||||
}
|
||||
|
||||
return log2[byte(n)] + 1
|
||||
}
|
||||
|
||||
// BitLenUint returns the bit width of the non zero part of n.
|
||||
func BitLenUint(n uint) int { // Should handle correctly [future] 64 bit Go uints
|
||||
if IntBits == 64 {
|
||||
return BitLenUint64(uint64(n))
|
||||
}
|
||||
|
||||
if b := n >> 24; b != 0 {
|
||||
return log2[b] + 24 + 1
|
||||
}
|
||||
|
||||
if b := n >> 16; b != 0 {
|
||||
return log2[b] + 16 + 1
|
||||
}
|
||||
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8 + 1
|
||||
}
|
||||
|
||||
return log2[n] + 1
|
||||
}
|
||||
|
||||
// BitLenUint64 returns the bit width of the non zero part of n.
|
||||
func BitLenUint64(n uint64) int {
|
||||
if b := n >> 56; b != 0 {
|
||||
return log2[b] + 56 + 1
|
||||
}
|
||||
|
||||
if b := n >> 48; b != 0 {
|
||||
return log2[b] + 48 + 1
|
||||
}
|
||||
|
||||
if b := n >> 40; b != 0 {
|
||||
return log2[b] + 40 + 1
|
||||
}
|
||||
|
||||
if b := n >> 32; b != 0 {
|
||||
return log2[b] + 32 + 1
|
||||
}
|
||||
|
||||
if b := n >> 24; b != 0 {
|
||||
return log2[b] + 24 + 1
|
||||
}
|
||||
|
||||
if b := n >> 16; b != 0 {
|
||||
return log2[b] + 16 + 1
|
||||
}
|
||||
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8 + 1
|
||||
}
|
||||
|
||||
return log2[n] + 1
|
||||
}
|
||||
|
||||
// BitLenUintptr returns the bit width of the non zero part of n.
|
||||
func BitLenUintptr(n uintptr) int {
|
||||
if b := n >> 56; b != 0 {
|
||||
return log2[b] + 56 + 1
|
||||
}
|
||||
|
||||
if b := n >> 48; b != 0 {
|
||||
return log2[b] + 48 + 1
|
||||
}
|
||||
|
||||
if b := n >> 40; b != 0 {
|
||||
return log2[b] + 40 + 1
|
||||
}
|
||||
|
||||
if b := n >> 32; b != 0 {
|
||||
return log2[b] + 32 + 1
|
||||
}
|
||||
|
||||
if b := n >> 24; b != 0 {
|
||||
return log2[b] + 24 + 1
|
||||
}
|
||||
|
||||
if b := n >> 16; b != 0 {
|
||||
return log2[b] + 16 + 1
|
||||
}
|
||||
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8 + 1
|
||||
}
|
||||
|
||||
return log2[n] + 1
|
||||
}
|
||||
|
||||
// PopCountByte returns population count of n (number of bits set in n).
|
||||
func PopCountByte(n byte) int {
|
||||
return int(popcnt[byte(n)])
|
||||
}
|
||||
|
||||
// PopCountUint16 returns population count of n (number of bits set in n).
|
||||
func PopCountUint16(n uint16) int {
|
||||
return int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)])
|
||||
}
|
||||
|
||||
// PopCountUint32 returns population count of n (number of bits set in n).
|
||||
func PopCountUint32(n uint32) int {
|
||||
return int(popcnt[byte(n>>24)]) + int(popcnt[byte(n>>16)]) +
|
||||
int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)])
|
||||
}
|
||||
|
||||
// PopCount returns population count of n (number of bits set in n).
|
||||
func PopCount(n int) int { // Should handle correctly [future] 64 bit Go ints
|
||||
if IntBits == 64 {
|
||||
return PopCountUint64(uint64(n))
|
||||
}
|
||||
|
||||
return PopCountUint32(uint32(n))
|
||||
}
|
||||
|
||||
// PopCountUint returns population count of n (number of bits set in n).
|
||||
func PopCountUint(n uint) int { // Should handle correctly [future] 64 bit Go uints
|
||||
if IntBits == 64 {
|
||||
return PopCountUint64(uint64(n))
|
||||
}
|
||||
|
||||
return PopCountUint32(uint32(n))
|
||||
}
|
||||
|
||||
// PopCountUintptr returns population count of n (number of bits set in n).
|
||||
func PopCountUintptr(n uintptr) int {
|
||||
if UintPtrBits == 64 {
|
||||
return PopCountUint64(uint64(n))
|
||||
}
|
||||
|
||||
return PopCountUint32(uint32(n))
|
||||
}
|
||||
|
||||
// PopCountUint64 returns population count of n (number of bits set in n).
|
||||
func PopCountUint64(n uint64) int {
|
||||
return int(popcnt[byte(n>>56)]) + int(popcnt[byte(n>>48)]) +
|
||||
int(popcnt[byte(n>>40)]) + int(popcnt[byte(n>>32)]) +
|
||||
int(popcnt[byte(n>>24)]) + int(popcnt[byte(n>>16)]) +
|
||||
int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)])
|
||||
}
|
||||
|
||||
// PopCountBigInt returns population count of |n| (number of bits set in |n|).
|
||||
func PopCountBigInt(n *big.Int) (r int) {
|
||||
for _, v := range n.Bits() {
|
||||
r += PopCountUintptr(uintptr(v))
|
||||
}
|
||||
return
|
||||
}
|
||||
46
vendor/github.com/cznic/mathutil/envelope.go
generated
vendored
Normal file
46
vendor/github.com/cznic/mathutil/envelope.go
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
import (
|
||||
"math"
|
||||
)
|
||||
|
||||
// Approximation type determines approximation methods used by e.g. Envelope.
|
||||
type Approximation int
|
||||
|
||||
// Specific approximation method tags
|
||||
const (
|
||||
_ Approximation = iota
|
||||
Linear // As named
|
||||
Sinusoidal // Smooth for all derivations
|
||||
)
|
||||
|
||||
// Envelope is an utility for defining simple curves using a small (usually)
|
||||
// set of data points. Envelope returns a value defined by x, points and
|
||||
// approximation. The value of x must be in [0,1) otherwise the result is
|
||||
// undefined or the function may panic. Points are interpreted as dividing the
|
||||
// [0,1) interval in len(points)-1 sections, so len(points) must be > 1 or the
|
||||
// function may panic. According to the left and right points closing/adjacent
|
||||
// to the section the resulting value is interpolated using the chosen
|
||||
// approximation method. Unsupported values of approximation are silently
|
||||
// interpreted as 'Linear'.
|
||||
func Envelope(x float64, points []float64, approximation Approximation) float64 {
|
||||
step := 1 / float64(len(points)-1)
|
||||
fslot := math.Floor(x / step)
|
||||
mod := x - fslot*step
|
||||
slot := int(fslot)
|
||||
l, r := points[slot], points[slot+1]
|
||||
rmod := mod / step
|
||||
switch approximation {
|
||||
case Sinusoidal:
|
||||
k := (math.Sin(math.Pi*(rmod-0.5)) + 1) / 2
|
||||
return l + (r-l)*k
|
||||
case Linear:
|
||||
fallthrough
|
||||
default:
|
||||
return l + (r-l)*rmod
|
||||
}
|
||||
}
|
||||
48
vendor/github.com/cznic/mathutil/example/example.go
generated
vendored
Normal file
48
vendor/github.com/cznic/mathutil/example/example.go
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
// Copyright (c) 2011 CZ.NIC z.s.p.o. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// blame: jnml, labs.nic.cz
|
||||
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"github.com/cznic/mathutil"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
)
|
||||
|
||||
/*
|
||||
|
||||
$ # Usage e.g.:
|
||||
$ go run example.go -max 1024 > mathutil.dat # generate 1kB of "random" data
|
||||
|
||||
*/
|
||||
func main() {
|
||||
r, err := mathutil.NewFC32(math.MinInt32, math.MaxInt32, true)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
var mflag uint64
|
||||
flag.Uint64Var(&mflag, "max", 0, "limit output to max bytes")
|
||||
flag.Parse()
|
||||
stdout := bufio.NewWriter(os.Stdout)
|
||||
if mflag != 0 {
|
||||
for i := uint64(0); i < mflag; i++ {
|
||||
if err := stdout.WriteByte(byte(r.Next())); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
stdout.Flush()
|
||||
return
|
||||
}
|
||||
|
||||
for stdout.WriteByte(byte(r.Next())) == nil {
|
||||
}
|
||||
}
|
||||
66
vendor/github.com/cznic/mathutil/example2/example2.go
generated
vendored
Normal file
66
vendor/github.com/cznic/mathutil/example2/example2.go
generated
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
// Copyright (c) 2011 CZ.NIC z.s.p.o. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// blame: jnml, labs.nic.cz
|
||||
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/cznic/mathutil"
|
||||
"image"
|
||||
"image/png"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"math"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
// $ go run example2.go # view rand.png and rnd.png by your favorite pic viewer
|
||||
//
|
||||
// see http://www.boallen.com/random-numbers.html
|
||||
func main() {
|
||||
sqr := image.Rect(0, 0, 511, 511)
|
||||
r, err := mathutil.NewFC32(math.MinInt32, math.MaxInt32, true)
|
||||
if err != nil {
|
||||
log.Fatal("NewFC32", err)
|
||||
}
|
||||
|
||||
img := image.NewGray(sqr)
|
||||
for y := 0; y < 512; y++ {
|
||||
for x := 0; x < 512; x++ {
|
||||
if r.Next()&1 != 0 {
|
||||
img.Set(x, y, image.White)
|
||||
}
|
||||
}
|
||||
}
|
||||
buf := bytes.NewBuffer(nil)
|
||||
if err := png.Encode(buf, img); err != nil {
|
||||
log.Fatal("Encode rnd.png ", err)
|
||||
}
|
||||
|
||||
if err := ioutil.WriteFile("rnd.png", buf.Bytes(), 0666); err != nil {
|
||||
log.Fatal("ioutil.WriteFile/rnd.png ", err)
|
||||
}
|
||||
|
||||
r2 := rand.New(rand.NewSource(0))
|
||||
img = image.NewGray(sqr)
|
||||
for y := 0; y < 512; y++ {
|
||||
for x := 0; x < 512; x++ {
|
||||
if r2.Int()&1 != 0 {
|
||||
img.Set(x, y, image.White)
|
||||
}
|
||||
}
|
||||
}
|
||||
buf = bytes.NewBuffer(nil)
|
||||
if err := png.Encode(buf, img); err != nil {
|
||||
log.Fatal("Encode rand.png ", err)
|
||||
}
|
||||
|
||||
if err := ioutil.WriteFile("rand.png", buf.Bytes(), 0666); err != nil {
|
||||
log.Fatal("ioutil.WriteFile/rand.png ", err)
|
||||
}
|
||||
}
|
||||
43
vendor/github.com/cznic/mathutil/example3/example3.go
generated
vendored
Normal file
43
vendor/github.com/cznic/mathutil/example3/example3.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
// Copyright (c) 2011 CZ.NIC z.s.p.o. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// blame: jnml, labs.nic.cz
|
||||
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"log"
|
||||
"math/rand"
|
||||
"os"
|
||||
)
|
||||
|
||||
/*
|
||||
|
||||
$ # Usage e.g.:
|
||||
$ go run example3.go -max 1024 > rand.dat # generate 1kB of "random" data
|
||||
|
||||
*/
|
||||
func main() {
|
||||
r := rand.New(rand.NewSource(1))
|
||||
var mflag uint64
|
||||
flag.Uint64Var(&mflag, "max", 0, "limit output to max bytes")
|
||||
flag.Parse()
|
||||
stdout := bufio.NewWriter(os.Stdout)
|
||||
if mflag != 0 {
|
||||
for i := uint64(0); i < mflag; i++ {
|
||||
if err := stdout.WriteByte(byte(r.Int())); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
stdout.Flush()
|
||||
return
|
||||
}
|
||||
|
||||
for stdout.WriteByte(byte(r.Int())) == nil {
|
||||
}
|
||||
}
|
||||
90
vendor/github.com/cznic/mathutil/example4/main.go
generated
vendored
Normal file
90
vendor/github.com/cznic/mathutil/example4/main.go
generated
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
// Copyright (c) 2011 jnml. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build ignore
|
||||
|
||||
// Let QRN be the number of quadratic residues of N. Let Q be QRN/N. From a
|
||||
// sorted list of primorial products < 2^32 find "record breakers". "Record
|
||||
// breaker" is N with new lowest Q.
|
||||
//
|
||||
// There are only 49 "record breakers" < 2^32.
|
||||
//
|
||||
// To run the example $ go run main.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/cznic/mathutil"
|
||||
"github.com/cznic/sortutil"
|
||||
)
|
||||
|
||||
func main() {
|
||||
pp := mathutil.PrimorialProductsUint32(0, math.MaxUint32, 32)
|
||||
sort.Sort(sortutil.Uint32Slice(pp))
|
||||
var bestN, bestD uint32 = 1, 1
|
||||
order, checks := 0, 0
|
||||
var ixDirty uint32
|
||||
m := make([]byte, math.MaxUint32>>3)
|
||||
for _, n := range pp {
|
||||
for i := range m[:ixDirty+1] {
|
||||
m[i] = 0
|
||||
}
|
||||
ixDirty = 0
|
||||
checks++
|
||||
limit0 := mathutil.QScaleUint32(n, bestN, bestD)
|
||||
if limit0 > math.MaxUint32 {
|
||||
panic(0)
|
||||
}
|
||||
limit := uint32(limit0)
|
||||
n64 := uint64(n)
|
||||
hi := n64 >> 1
|
||||
hits := uint32(0)
|
||||
check := true
|
||||
fmt.Printf("\r%10d %d/%d", n, checks, len(pp))
|
||||
t0 := time.Now()
|
||||
for i := uint64(0); i < hi; i++ {
|
||||
sq := uint32(i * i % n64)
|
||||
ix := sq >> 3
|
||||
msk := byte(1 << (sq & 7))
|
||||
if m[ix]&msk == 0 {
|
||||
hits++
|
||||
if hits >= limit {
|
||||
check = false
|
||||
break
|
||||
}
|
||||
}
|
||||
m[ix] |= msk
|
||||
if ix > ixDirty {
|
||||
ixDirty = ix
|
||||
}
|
||||
}
|
||||
|
||||
adjPrime := ".." // Composite before
|
||||
if mathutil.IsPrime(n - 1) {
|
||||
adjPrime = "P." // Prime before
|
||||
}
|
||||
switch mathutil.IsPrime(n + 1) {
|
||||
case true:
|
||||
adjPrime += "P" // Prime after
|
||||
case false:
|
||||
adjPrime += "." // Composite after
|
||||
}
|
||||
|
||||
if check && mathutil.QCmpUint32(hits, n, bestN, bestD) < 0 {
|
||||
order++
|
||||
d := time.Since(t0)
|
||||
bestN, bestD = hits, n
|
||||
q := float64(hits) / float64(n)
|
||||
fmt.Printf(
|
||||
"\r%2s #%03d %d %d %.2f %.2E %s %s %v\n",
|
||||
adjPrime, order, n, hits,
|
||||
1/q, q, d, time.Now().Format("15:04:05"), mathutil.FactorInt(n),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
83
vendor/github.com/cznic/mathutil/ff/main.go
generated
vendored
Normal file
83
vendor/github.com/cznic/mathutil/ff/main.go
generated
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
// Copyright (c) jnml. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build ignore
|
||||
|
||||
// Factor Finder - searches for Mersenne number factors of one specific special
|
||||
// form.
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"math/big"
|
||||
"runtime"
|
||||
"time"
|
||||
|
||||
"github.com/cznic/mathutil"
|
||||
)
|
||||
|
||||
const (
|
||||
pp = 1
|
||||
pp2 = 10
|
||||
)
|
||||
|
||||
var (
|
||||
_1 = big.NewInt(1)
|
||||
_2 = big.NewInt(2)
|
||||
)
|
||||
|
||||
func main() {
|
||||
runtime.GOMAXPROCS(2)
|
||||
oClass := flag.Uint64("c", 2, `factor "class" number`)
|
||||
oDuration := flag.Duration("d", time.Second, "duration to spend on one class")
|
||||
flag.Parse()
|
||||
class := *oClass
|
||||
for class&1 != 0 {
|
||||
class >>= 1
|
||||
}
|
||||
class = mathutil.MaxUint64(class, 2)
|
||||
|
||||
for {
|
||||
c := time.After(*oDuration)
|
||||
factor := big.NewInt(0)
|
||||
factor.SetUint64(class)
|
||||
exp := big.NewInt(0)
|
||||
oneClass:
|
||||
for {
|
||||
select {
|
||||
case <-c:
|
||||
break oneClass
|
||||
default:
|
||||
}
|
||||
|
||||
exp.Set(factor)
|
||||
factor.Lsh(factor, 1)
|
||||
factor.Add(factor, _1)
|
||||
if !factor.ProbablyPrime(pp) {
|
||||
continue
|
||||
}
|
||||
|
||||
if !exp.ProbablyPrime(pp) {
|
||||
continue
|
||||
}
|
||||
|
||||
if mathutil.ModPowBigInt(_2, exp, factor).Cmp(_1) != 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
if !factor.ProbablyPrime(pp2) {
|
||||
continue
|
||||
}
|
||||
|
||||
if !exp.ProbablyPrime(pp2) {
|
||||
continue
|
||||
}
|
||||
|
||||
fmt.Printf("%d: %s | M%s (%d bits)\n", class, factor, exp, factor.BitLen())
|
||||
}
|
||||
|
||||
class += 2
|
||||
}
|
||||
}
|
||||
829
vendor/github.com/cznic/mathutil/mathutil.go
generated
vendored
Normal file
829
vendor/github.com/cznic/mathutil/mathutil.go
generated
vendored
Normal file
@@ -0,0 +1,829 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package mathutil provides utilities supplementing the standard 'math' and
|
||||
// 'math/rand' packages.
|
||||
//
|
||||
// Compatibility issues
|
||||
//
|
||||
// 2013-12-13: The following functions have been REMOVED
|
||||
//
|
||||
// func Uint64ToBigInt(n uint64) *big.Int
|
||||
// func Uint64FromBigInt(n *big.Int) (uint64, bool)
|
||||
//
|
||||
// 2013-05-13: The following functions are now DEPRECATED
|
||||
//
|
||||
// func Uint64ToBigInt(n uint64) *big.Int
|
||||
// func Uint64FromBigInt(n *big.Int) (uint64, bool)
|
||||
//
|
||||
// These functions will be REMOVED with Go release 1.1+1.
|
||||
//
|
||||
// 2013-01-21: The following functions have been REMOVED
|
||||
//
|
||||
// func MaxInt() int
|
||||
// func MinInt() int
|
||||
// func MaxUint() uint
|
||||
// func UintPtrBits() int
|
||||
//
|
||||
// They are now replaced by untyped constants
|
||||
//
|
||||
// MaxInt
|
||||
// MinInt
|
||||
// MaxUint
|
||||
// UintPtrBits
|
||||
//
|
||||
// Additionally one more untyped constant was added
|
||||
//
|
||||
// IntBits
|
||||
//
|
||||
// This change breaks any existing code depending on the above removed
|
||||
// functions. They should have not been published in the first place, that was
|
||||
// unfortunate. Instead, defining such architecture and/or implementation
|
||||
// specific integer limits and bit widths as untyped constants improves
|
||||
// performance and allows for static dead code elimination if it depends on
|
||||
// these values. Thanks to minux for pointing it out in the mail list
|
||||
// (https://groups.google.com/d/msg/golang-nuts/tlPpLW6aJw8/NT3mpToH-a4J).
|
||||
//
|
||||
// 2012-12-12: The following functions will be DEPRECATED with Go release
|
||||
// 1.0.3+1 and REMOVED with Go release 1.0.3+2, b/c of
|
||||
// http://code.google.com/p/go/source/detail?r=954a79ee3ea8
|
||||
//
|
||||
// func Uint64ToBigInt(n uint64) *big.Int
|
||||
// func Uint64FromBigInt(n *big.Int) (uint64, bool)
|
||||
package mathutil
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
// Architecture and/or implementation specific integer limits and bit widths.
|
||||
const (
|
||||
MaxInt = 1<<(IntBits-1) - 1
|
||||
MinInt = -MaxInt - 1
|
||||
MaxUint = 1<<IntBits - 1
|
||||
IntBits = 1 << (^uint(0)>>32&1 + ^uint(0)>>16&1 + ^uint(0)>>8&1 + 3)
|
||||
UintPtrBits = 1 << (^uintptr(0)>>32&1 + ^uintptr(0)>>16&1 + ^uintptr(0)>>8&1 + 3)
|
||||
)
|
||||
|
||||
var (
|
||||
_1 = big.NewInt(1)
|
||||
_2 = big.NewInt(2)
|
||||
)
|
||||
|
||||
// GCDByte returns the greatest common divisor of a and b. Based on:
|
||||
// http://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations
|
||||
func GCDByte(a, b byte) byte {
|
||||
for b != 0 {
|
||||
a, b = b, a%b
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
// GCDUint16 returns the greatest common divisor of a and b.
|
||||
func GCDUint16(a, b uint16) uint16 {
|
||||
for b != 0 {
|
||||
a, b = b, a%b
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
// GCD returns the greatest common divisor of a and b.
|
||||
func GCDUint32(a, b uint32) uint32 {
|
||||
for b != 0 {
|
||||
a, b = b, a%b
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
// GCD64 returns the greatest common divisor of a and b.
|
||||
func GCDUint64(a, b uint64) uint64 {
|
||||
for b != 0 {
|
||||
a, b = b, a%b
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
// ISqrt returns floor(sqrt(n)). Typical run time is few hundreds of ns.
|
||||
func ISqrt(n uint32) (x uint32) {
|
||||
if n == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if n >= math.MaxUint16*math.MaxUint16 {
|
||||
return math.MaxUint16
|
||||
}
|
||||
|
||||
var px, nx uint32
|
||||
for x = n; ; px, x = x, nx {
|
||||
nx = (x + n/x) / 2
|
||||
if nx == x || nx == px {
|
||||
break
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// SqrtUint64 returns floor(sqrt(n)). Typical run time is about 0.5 µs.
|
||||
func SqrtUint64(n uint64) (x uint64) {
|
||||
if n == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if n >= math.MaxUint32*math.MaxUint32 {
|
||||
return math.MaxUint32
|
||||
}
|
||||
|
||||
var px, nx uint64
|
||||
for x = n; ; px, x = x, nx {
|
||||
nx = (x + n/x) / 2
|
||||
if nx == x || nx == px {
|
||||
break
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// SqrtBig returns floor(sqrt(n)). It panics on n < 0.
|
||||
func SqrtBig(n *big.Int) (x *big.Int) {
|
||||
switch n.Sign() {
|
||||
case -1:
|
||||
panic(-1)
|
||||
case 0:
|
||||
return big.NewInt(0)
|
||||
}
|
||||
|
||||
var px, nx big.Int
|
||||
x = big.NewInt(0)
|
||||
x.SetBit(x, n.BitLen()/2+1, 1)
|
||||
for {
|
||||
nx.Rsh(nx.Add(x, nx.Div(n, x)), 1)
|
||||
if nx.Cmp(x) == 0 || nx.Cmp(&px) == 0 {
|
||||
break
|
||||
}
|
||||
px.Set(x)
|
||||
x.Set(&nx)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Log2Byte returns log base 2 of n. It's the same as index of the highest
|
||||
// bit set in n. For n == 0 -1 is returned.
|
||||
func Log2Byte(n byte) int {
|
||||
return log2[n]
|
||||
}
|
||||
|
||||
// Log2Uint16 returns log base 2 of n. It's the same as index of the highest
|
||||
// bit set in n. For n == 0 -1 is returned.
|
||||
func Log2Uint16(n uint16) int {
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8
|
||||
}
|
||||
|
||||
return log2[n]
|
||||
}
|
||||
|
||||
// Log2Uint32 returns log base 2 of n. It's the same as index of the highest
|
||||
// bit set in n. For n == 0 -1 is returned.
|
||||
func Log2Uint32(n uint32) int {
|
||||
if b := n >> 24; b != 0 {
|
||||
return log2[b] + 24
|
||||
}
|
||||
|
||||
if b := n >> 16; b != 0 {
|
||||
return log2[b] + 16
|
||||
}
|
||||
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8
|
||||
}
|
||||
|
||||
return log2[n]
|
||||
}
|
||||
|
||||
// Log2Uint64 returns log base 2 of n. It's the same as index of the highest
|
||||
// bit set in n. For n == 0 -1 is returned.
|
||||
func Log2Uint64(n uint64) int {
|
||||
if b := n >> 56; b != 0 {
|
||||
return log2[b] + 56
|
||||
}
|
||||
|
||||
if b := n >> 48; b != 0 {
|
||||
return log2[b] + 48
|
||||
}
|
||||
|
||||
if b := n >> 40; b != 0 {
|
||||
return log2[b] + 40
|
||||
}
|
||||
|
||||
if b := n >> 32; b != 0 {
|
||||
return log2[b] + 32
|
||||
}
|
||||
|
||||
if b := n >> 24; b != 0 {
|
||||
return log2[b] + 24
|
||||
}
|
||||
|
||||
if b := n >> 16; b != 0 {
|
||||
return log2[b] + 16
|
||||
}
|
||||
|
||||
if b := n >> 8; b != 0 {
|
||||
return log2[b] + 8
|
||||
}
|
||||
|
||||
return log2[n]
|
||||
}
|
||||
|
||||
// ModPowByte computes (b^e)%m. It panics for m == 0 || b == e == 0.
|
||||
//
|
||||
// See also: http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method
|
||||
func ModPowByte(b, e, m byte) byte {
|
||||
if b == 0 && e == 0 {
|
||||
panic(0)
|
||||
}
|
||||
|
||||
if m == 1 {
|
||||
return 0
|
||||
}
|
||||
|
||||
r := uint16(1)
|
||||
for b, m := uint16(b), uint16(m); e > 0; b, e = b*b%m, e>>1 {
|
||||
if e&1 == 1 {
|
||||
r = r * b % m
|
||||
}
|
||||
}
|
||||
return byte(r)
|
||||
}
|
||||
|
||||
// ModPowByte computes (b^e)%m. It panics for m == 0 || b == e == 0.
|
||||
func ModPowUint16(b, e, m uint16) uint16 {
|
||||
if b == 0 && e == 0 {
|
||||
panic(0)
|
||||
}
|
||||
|
||||
if m == 1 {
|
||||
return 0
|
||||
}
|
||||
|
||||
r := uint32(1)
|
||||
for b, m := uint32(b), uint32(m); e > 0; b, e = b*b%m, e>>1 {
|
||||
if e&1 == 1 {
|
||||
r = r * b % m
|
||||
}
|
||||
}
|
||||
return uint16(r)
|
||||
}
|
||||
|
||||
// ModPowUint32 computes (b^e)%m. It panics for m == 0 || b == e == 0.
|
||||
func ModPowUint32(b, e, m uint32) uint32 {
|
||||
if b == 0 && e == 0 {
|
||||
panic(0)
|
||||
}
|
||||
|
||||
if m == 1 {
|
||||
return 0
|
||||
}
|
||||
|
||||
r := uint64(1)
|
||||
for b, m := uint64(b), uint64(m); e > 0; b, e = b*b%m, e>>1 {
|
||||
if e&1 == 1 {
|
||||
r = r * b % m
|
||||
}
|
||||
}
|
||||
return uint32(r)
|
||||
}
|
||||
|
||||
// ModPowUint64 computes (b^e)%m. It panics for m == 0 || b == e == 0.
|
||||
func ModPowUint64(b, e, m uint64) (r uint64) {
|
||||
if b == 0 && e == 0 {
|
||||
panic(0)
|
||||
}
|
||||
|
||||
if m == 1 {
|
||||
return 0
|
||||
}
|
||||
|
||||
return modPowBigInt(big.NewInt(0).SetUint64(b), big.NewInt(0).SetUint64(e), big.NewInt(0).SetUint64(m)).Uint64()
|
||||
}
|
||||
|
||||
func modPowBigInt(b, e, m *big.Int) (r *big.Int) {
|
||||
r = big.NewInt(1)
|
||||
for i, n := 0, e.BitLen(); i < n; i++ {
|
||||
if e.Bit(i) != 0 {
|
||||
r.Mod(r.Mul(r, b), m)
|
||||
}
|
||||
b.Mod(b.Mul(b, b), m)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// ModPowBigInt computes (b^e)%m. Returns nil for e < 0. It panics for m == 0 || b == e == 0.
|
||||
func ModPowBigInt(b, e, m *big.Int) (r *big.Int) {
|
||||
if b.Sign() == 0 && e.Sign() == 0 {
|
||||
panic(0)
|
||||
}
|
||||
|
||||
if m.Cmp(_1) == 0 {
|
||||
return big.NewInt(0)
|
||||
}
|
||||
|
||||
if e.Sign() < 0 {
|
||||
return
|
||||
}
|
||||
|
||||
return modPowBigInt(big.NewInt(0).Set(b), big.NewInt(0).Set(e), m)
|
||||
}
|
||||
|
||||
var uint64ToBigIntDelta big.Int
|
||||
|
||||
func init() {
|
||||
uint64ToBigIntDelta.SetBit(&uint64ToBigIntDelta, 63, 1)
|
||||
}
|
||||
|
||||
var uintptrBits int
|
||||
|
||||
func init() {
|
||||
x := uint64(math.MaxUint64)
|
||||
uintptrBits = BitLenUintptr(uintptr(x))
|
||||
}
|
||||
|
||||
// UintptrBits returns the bit width of an uintptr at the executing machine.
|
||||
func UintptrBits() int {
|
||||
return uintptrBits
|
||||
}
|
||||
|
||||
// AddUint128_64 returns the uint128 sum of uint64 a and b.
|
||||
func AddUint128_64(a, b uint64) (hi uint64, lo uint64) {
|
||||
lo = a + b
|
||||
if lo < a {
|
||||
hi = 1
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MulUint128_64 returns the uint128 bit product of uint64 a and b.
|
||||
func MulUint128_64(a, b uint64) (hi, lo uint64) {
|
||||
/*
|
||||
2^(2 W) ahi bhi + 2^W alo bhi + 2^W ahi blo + alo blo
|
||||
|
||||
FEDCBA98 76543210 FEDCBA98 76543210
|
||||
---- alo*blo ----
|
||||
---- alo*bhi ----
|
||||
---- ahi*blo ----
|
||||
---- ahi*bhi ----
|
||||
*/
|
||||
const w = 32
|
||||
const m = 1<<w - 1
|
||||
ahi, bhi, alo, blo := a>>w, b>>w, a&m, b&m
|
||||
lo = alo * blo
|
||||
mid1 := alo * bhi
|
||||
mid2 := ahi * blo
|
||||
c1, lo := AddUint128_64(lo, mid1<<w)
|
||||
c2, lo := AddUint128_64(lo, mid2<<w)
|
||||
_, hi = AddUint128_64(ahi*bhi, mid1>>w+mid2>>w+uint64(c1+c2))
|
||||
return
|
||||
}
|
||||
|
||||
// PowerizeBigInt returns (e, p) such that e is the smallest number for which p
|
||||
// == b^e is greater or equal n. For n < 0 or b < 2 (0, nil) is returned.
|
||||
//
|
||||
// NOTE: Run time for large values of n (above about 2^1e6 ~= 1e300000) can be
|
||||
// significant and/or unacceptabe. For any smaller values of n the function
|
||||
// typically performs in sub second time. For "small" values of n (cca bellow
|
||||
// 2^1e3 ~= 1e300) the same can be easily below 10 µs.
|
||||
//
|
||||
// A special (and trivial) case of b == 2 is handled separately and performs
|
||||
// much faster.
|
||||
func PowerizeBigInt(b, n *big.Int) (e uint32, p *big.Int) {
|
||||
switch {
|
||||
case b.Cmp(_2) < 0 || n.Sign() < 0:
|
||||
return
|
||||
case n.Sign() == 0 || n.Cmp(_1) == 0:
|
||||
return 0, big.NewInt(1)
|
||||
case b.Cmp(_2) == 0:
|
||||
p = big.NewInt(0)
|
||||
e = uint32(n.BitLen() - 1)
|
||||
p.SetBit(p, int(e), 1)
|
||||
if p.Cmp(n) < 0 {
|
||||
p.Mul(p, _2)
|
||||
e++
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
bw := b.BitLen()
|
||||
nw := n.BitLen()
|
||||
p = big.NewInt(1)
|
||||
var bb, r big.Int
|
||||
for {
|
||||
switch p.Cmp(n) {
|
||||
case -1:
|
||||
x := uint32((nw - p.BitLen()) / bw)
|
||||
if x == 0 {
|
||||
x = 1
|
||||
}
|
||||
e += x
|
||||
switch x {
|
||||
case 1:
|
||||
p.Mul(p, b)
|
||||
default:
|
||||
r.Set(_1)
|
||||
bb.Set(b)
|
||||
e := x
|
||||
for {
|
||||
if e&1 != 0 {
|
||||
r.Mul(&r, &bb)
|
||||
}
|
||||
if e >>= 1; e == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
bb.Mul(&bb, &bb)
|
||||
}
|
||||
p.Mul(p, &r)
|
||||
}
|
||||
case 0, 1:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PowerizeUint32BigInt returns (e, p) such that e is the smallest number for
|
||||
// which p == b^e is greater or equal n. For n < 0 or b < 2 (0, nil) is
|
||||
// returned.
|
||||
//
|
||||
// More info: see PowerizeBigInt.
|
||||
func PowerizeUint32BigInt(b uint32, n *big.Int) (e uint32, p *big.Int) {
|
||||
switch {
|
||||
case b < 2 || n.Sign() < 0:
|
||||
return
|
||||
case n.Sign() == 0 || n.Cmp(_1) == 0:
|
||||
return 0, big.NewInt(1)
|
||||
case b == 2:
|
||||
p = big.NewInt(0)
|
||||
e = uint32(n.BitLen() - 1)
|
||||
p.SetBit(p, int(e), 1)
|
||||
if p.Cmp(n) < 0 {
|
||||
p.Mul(p, _2)
|
||||
e++
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
var bb big.Int
|
||||
bb.SetInt64(int64(b))
|
||||
return PowerizeBigInt(&bb, n)
|
||||
}
|
||||
|
||||
/*
|
||||
ProbablyPrimeUint32 returns true if n is prime or n is a pseudoprime to base a.
|
||||
It implements the Miller-Rabin primality test for one specific value of 'a' and
|
||||
k == 1.
|
||||
|
||||
Wrt pseudocode shown at
|
||||
http://en.wikipedia.org/wiki/Miller-Rabin_primality_test#Algorithm_and_running_time
|
||||
|
||||
Input: n > 3, an odd integer to be tested for primality;
|
||||
Input: k, a parameter that determines the accuracy of the test
|
||||
Output: composite if n is composite, otherwise probably prime
|
||||
write n − 1 as 2^s·d with d odd by factoring powers of 2 from n − 1
|
||||
LOOP: repeat k times:
|
||||
pick a random integer a in the range [2, n − 2]
|
||||
x ← a^d mod n
|
||||
if x = 1 or x = n − 1 then do next LOOP
|
||||
for r = 1 .. s − 1
|
||||
x ← x^2 mod n
|
||||
if x = 1 then return composite
|
||||
if x = n − 1 then do next LOOP
|
||||
return composite
|
||||
return probably prime
|
||||
|
||||
... this function behaves like passing 1 for 'k' and additionaly a
|
||||
fixed/non-random 'a'. Otherwise it's the same algorithm.
|
||||
|
||||
See also: http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html
|
||||
*/
|
||||
func ProbablyPrimeUint32(n, a uint32) bool {
|
||||
d, s := n-1, 0
|
||||
for ; d&1 == 0; d, s = d>>1, s+1 {
|
||||
}
|
||||
x := uint64(ModPowUint32(a, d, n))
|
||||
if x == 1 || uint32(x) == n-1 {
|
||||
return true
|
||||
}
|
||||
|
||||
for ; s > 1; s-- {
|
||||
if x = x * x % uint64(n); x == 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
if uint32(x) == n-1 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ProbablyPrimeUint64_32 returns true if n is prime or n is a pseudoprime to
|
||||
// base a. It implements the Miller-Rabin primality test for one specific value
|
||||
// of 'a' and k == 1. See also ProbablyPrimeUint32.
|
||||
func ProbablyPrimeUint64_32(n uint64, a uint32) bool {
|
||||
d, s := n-1, 0
|
||||
for ; d&1 == 0; d, s = d>>1, s+1 {
|
||||
}
|
||||
x := ModPowUint64(uint64(a), d, n)
|
||||
if x == 1 || x == n-1 {
|
||||
return true
|
||||
}
|
||||
|
||||
bx, bn := big.NewInt(0).SetUint64(x), big.NewInt(0).SetUint64(n)
|
||||
for ; s > 1; s-- {
|
||||
if x = bx.Mod(bx.Mul(bx, bx), bn).Uint64(); x == 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
if x == n-1 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ProbablyPrimeBigInt_32 returns true if n is prime or n is a pseudoprime to
|
||||
// base a. It implements the Miller-Rabin primality test for one specific value
|
||||
// of 'a' and k == 1. See also ProbablyPrimeUint32.
|
||||
func ProbablyPrimeBigInt_32(n *big.Int, a uint32) bool {
|
||||
var d big.Int
|
||||
d.Set(n)
|
||||
d.Sub(&d, _1) // d <- n-1
|
||||
s := 0
|
||||
for ; d.Bit(s) == 0; s++ {
|
||||
}
|
||||
nMinus1 := big.NewInt(0).Set(&d)
|
||||
d.Rsh(&d, uint(s))
|
||||
|
||||
x := ModPowBigInt(big.NewInt(int64(a)), &d, n)
|
||||
if x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
for ; s > 1; s-- {
|
||||
if x = x.Mod(x.Mul(x, x), n); x.Cmp(_1) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if x.Cmp(nMinus1) == 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ProbablyPrimeBigInt returns true if n is prime or n is a pseudoprime to base
|
||||
// a. It implements the Miller-Rabin primality test for one specific value of
|
||||
// 'a' and k == 1. See also ProbablyPrimeUint32.
|
||||
func ProbablyPrimeBigInt(n, a *big.Int) bool {
|
||||
var d big.Int
|
||||
d.Set(n)
|
||||
d.Sub(&d, _1) // d <- n-1
|
||||
s := 0
|
||||
for ; d.Bit(s) == 0; s++ {
|
||||
}
|
||||
nMinus1 := big.NewInt(0).Set(&d)
|
||||
d.Rsh(&d, uint(s))
|
||||
|
||||
x := ModPowBigInt(a, &d, n)
|
||||
if x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
for ; s > 1; s-- {
|
||||
if x = x.Mod(x.Mul(x, x), n); x.Cmp(_1) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if x.Cmp(nMinus1) == 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Max returns the larger of a and b.
|
||||
func Max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// Min returns the smaller of a and b.
|
||||
func Min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// UMax returns the larger of a and b.
|
||||
func UMax(a, b uint) uint {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// UMin returns the smaller of a and b.
|
||||
func UMin(a, b uint) uint {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxByte returns the larger of a and b.
|
||||
func MaxByte(a, b byte) byte {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinByte returns the smaller of a and b.
|
||||
func MinByte(a, b byte) byte {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxInt8 returns the larger of a and b.
|
||||
func MaxInt8(a, b int8) int8 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinInt8 returns the smaller of a and b.
|
||||
func MinInt8(a, b int8) int8 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxUint16 returns the larger of a and b.
|
||||
func MaxUint16(a, b uint16) uint16 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinUint16 returns the smaller of a and b.
|
||||
func MinUint16(a, b uint16) uint16 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxInt16 returns the larger of a and b.
|
||||
func MaxInt16(a, b int16) int16 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinInt16 returns the smaller of a and b.
|
||||
func MinInt16(a, b int16) int16 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxUint32 returns the larger of a and b.
|
||||
func MaxUint32(a, b uint32) uint32 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinUint32 returns the smaller of a and b.
|
||||
func MinUint32(a, b uint32) uint32 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxInt32 returns the larger of a and b.
|
||||
func MaxInt32(a, b int32) int32 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinInt32 returns the smaller of a and b.
|
||||
func MinInt32(a, b int32) int32 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxUint64 returns the larger of a and b.
|
||||
func MaxUint64(a, b uint64) uint64 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinUint64 returns the smaller of a and b.
|
||||
func MinUint64(a, b uint64) uint64 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MaxInt64 returns the larger of a and b.
|
||||
func MaxInt64(a, b int64) int64 {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// MinInt64 returns the smaller of a and b.
|
||||
func MinInt64(a, b int64) int64 {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// ToBase produces n in base b. For example
|
||||
//
|
||||
// ToBase(2047, 22) -> [1, 5, 4]
|
||||
//
|
||||
// 1 * 22^0 1
|
||||
// 5 * 22^1 110
|
||||
// 4 * 22^2 1936
|
||||
// ----
|
||||
// 2047
|
||||
//
|
||||
// ToBase panics for bases < 2.
|
||||
func ToBase(n *big.Int, b int) []int {
|
||||
var nn big.Int
|
||||
nn.Set(n)
|
||||
if b < 2 {
|
||||
panic("invalid base")
|
||||
}
|
||||
|
||||
k := 1
|
||||
switch nn.Sign() {
|
||||
case -1:
|
||||
nn.Neg(&nn)
|
||||
k = -1
|
||||
case 0:
|
||||
return []int{0}
|
||||
}
|
||||
|
||||
bb := big.NewInt(int64(b))
|
||||
var r []int
|
||||
rem := big.NewInt(0)
|
||||
for nn.Sign() != 0 {
|
||||
nn.QuoRem(&nn, bb, rem)
|
||||
r = append(r, k*int(rem.Int64()))
|
||||
}
|
||||
return r
|
||||
}
|
||||
297
vendor/github.com/cznic/mathutil/mersenne/mersenne.go
generated
vendored
Normal file
297
vendor/github.com/cznic/mathutil/mersenne/mersenne.go
generated
vendored
Normal file
@@ -0,0 +1,297 @@
|
||||
// Copyright (c) 2014 The mersenne Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
/*
|
||||
Package mersenne collects utilities related to Mersenne numbers[1] and/or some
|
||||
of their properties.
|
||||
|
||||
Exponent
|
||||
|
||||
In this documentation the term 'exponent' refers to 'n' of a Mersenne number Mn
|
||||
equal to 2^n-1. This package supports only uint32 sized exponents. New()
|
||||
currently supports exponents only up to math.MaxInt32 (31 bits, up to 256 MB
|
||||
required to represent such Mn in memory as a big.Int).
|
||||
|
||||
Links
|
||||
|
||||
Referenced from above:
|
||||
[1] http://en.wikipedia.org/wiki/Mersenne_number
|
||||
*/
|
||||
package mersenne
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/big"
|
||||
|
||||
"github.com/cznic/mathutil"
|
||||
"github.com/remyoudompheng/bigfft"
|
||||
)
|
||||
|
||||
var (
|
||||
_0 = big.NewInt(0)
|
||||
_1 = big.NewInt(1)
|
||||
_2 = big.NewInt(2)
|
||||
)
|
||||
|
||||
// Knowns list the exponent of currently (March 2012) known Mersenne primes
|
||||
// exponents in order. See also: http://oeis.org/A000043 for a partial list.
|
||||
var Knowns = []uint32{
|
||||
2, // #1
|
||||
3, // #2
|
||||
5, // #3
|
||||
7, // #4
|
||||
13, // #5
|
||||
17, // #6
|
||||
19, // #7
|
||||
31, // #8
|
||||
61, // #9
|
||||
89, // #10
|
||||
|
||||
107, // #11
|
||||
127, // #12
|
||||
521, // #13
|
||||
607, // #14
|
||||
1279, // #15
|
||||
2203, // #16
|
||||
2281, // #17
|
||||
3217, // #18
|
||||
4253, // #19
|
||||
4423, // #20
|
||||
|
||||
9689, // #21
|
||||
9941, // #22
|
||||
11213, // #23
|
||||
19937, // #24
|
||||
21701, // #25
|
||||
23209, // #26
|
||||
44497, // #27
|
||||
86243, // #28
|
||||
110503, // #29
|
||||
132049, // #30
|
||||
|
||||
216091, // #31
|
||||
756839, // #32
|
||||
859433, // #33
|
||||
1257787, // #34
|
||||
1398269, // #35
|
||||
2976221, // #36
|
||||
3021377, // #37
|
||||
6972593, // #38
|
||||
13466917, // #39
|
||||
20996011, // #40
|
||||
|
||||
24036583, // #41
|
||||
25964951, // #42
|
||||
30402457, // #43
|
||||
32582657, // #44
|
||||
37156667, // #45
|
||||
42643801, // #46
|
||||
43112609, // #47
|
||||
57885161, // #48
|
||||
74207281, // #49
|
||||
}
|
||||
|
||||
// Known maps the exponent of known Mersenne primes its ordinal number/rank.
|
||||
// Ranks > 41 are currently provisional.
|
||||
var Known map[uint32]int
|
||||
|
||||
func init() {
|
||||
Known = map[uint32]int{}
|
||||
for i, v := range Knowns {
|
||||
Known[v] = i + 1
|
||||
}
|
||||
}
|
||||
|
||||
// New returns Mn == 2^n-1 for n <= math.MaxInt32 or nil otherwise.
|
||||
func New(n uint32) (m *big.Int) {
|
||||
if n > math.MaxInt32 {
|
||||
return
|
||||
}
|
||||
|
||||
m = big.NewInt(0)
|
||||
return m.Sub(m.SetBit(m, int(n), 1), _1)
|
||||
}
|
||||
|
||||
// HasFactorUint32 returns true if d | Mn. Typical run time for a 32 bit factor
|
||||
// and a 32 bit exponent is < 1 µs.
|
||||
func HasFactorUint32(d, n uint32) bool {
|
||||
return d == 1 || d&1 != 0 && mathutil.ModPowUint32(2, n, d) == 1
|
||||
}
|
||||
|
||||
// HasFactorUint64 returns true if d | Mn. Typical run time for a 64 bit factor
|
||||
// and a 32 bit exponent is < 30 µs.
|
||||
func HasFactorUint64(d uint64, n uint32) bool {
|
||||
return d == 1 || d&1 != 0 && mathutil.ModPowUint64(2, uint64(n), d) == 1
|
||||
}
|
||||
|
||||
// HasFactorBigInt returns true if d | Mn, d > 0. Typical run time for a 128
|
||||
// bit factor and a 32 bit exponent is < 75 µs.
|
||||
func HasFactorBigInt(d *big.Int, n uint32) bool {
|
||||
return d.Cmp(_1) == 0 || d.Sign() > 0 && d.Bit(0) == 1 &&
|
||||
mathutil.ModPowBigInt(_2, big.NewInt(int64(n)), d).Cmp(_1) == 0
|
||||
}
|
||||
|
||||
// HasFactorBigInt2 returns true if d | Mn, d > 0
|
||||
func HasFactorBigInt2(d, n *big.Int) bool {
|
||||
return d.Cmp(_1) == 0 || d.Sign() > 0 && d.Bit(0) == 1 &&
|
||||
mathutil.ModPowBigInt(_2, n, d).Cmp(_1) == 0
|
||||
}
|
||||
|
||||
/*
|
||||
FromFactorBigInt returns n such that d | Mn if n <= max and d is odd. In other
|
||||
cases zero is returned.
|
||||
|
||||
It is conjectured that every odd d ∊ N divides infinitely many Mersenne numbers.
|
||||
The returned n should be the exponent of smallest such Mn.
|
||||
|
||||
NOTE: The computation of n from a given d performs roughly in O(n). It is
|
||||
thus highly recomended to use the 'max' argument to limit the "searched"
|
||||
exponent upper bound as appropriate. Otherwise the computation can take a long
|
||||
time as a large factor can be a divisor of a Mn with exponent above the uint32
|
||||
limits.
|
||||
|
||||
The FromFactorBigInt function is a modification of the original Will
|
||||
Edgington's "reverse method", discussed here:
|
||||
http://tech.groups.yahoo.com/group/primenumbers/message/15061
|
||||
*/
|
||||
func FromFactorBigInt(d *big.Int, max uint32) (n uint32) {
|
||||
if d.Bit(0) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
var m big.Int
|
||||
for n < max {
|
||||
m.Add(&m, d)
|
||||
i := 0
|
||||
for ; m.Bit(i) == 1; i++ {
|
||||
if n == math.MaxUint32 {
|
||||
return 0
|
||||
}
|
||||
|
||||
n++
|
||||
}
|
||||
m.Rsh(&m, uint(i))
|
||||
if m.Sign() == 0 {
|
||||
if n > max {
|
||||
n = 0
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// Mod sets mod to n % Mexp and returns mod. It panics for exp == 0 || exp >=
|
||||
// math.MaxInt32 || n < 0.
|
||||
func Mod(mod, n *big.Int, exp uint32) *big.Int {
|
||||
if exp == 0 || exp >= math.MaxInt32 || n.Sign() < 0 {
|
||||
panic(0)
|
||||
}
|
||||
|
||||
m := New(exp)
|
||||
mod.Set(n)
|
||||
var x big.Int
|
||||
for mod.BitLen() > int(exp) {
|
||||
x.Set(mod)
|
||||
x.Rsh(&x, uint(exp))
|
||||
mod.And(mod, m)
|
||||
mod.Add(mod, &x)
|
||||
}
|
||||
if mod.BitLen() == int(exp) && mod.Cmp(m) == 0 {
|
||||
mod.SetInt64(0)
|
||||
}
|
||||
return mod
|
||||
}
|
||||
|
||||
// ModPow2 returns x such that 2^Me % Mm == 2^x. It panics for m < 2. Typical
|
||||
// run time is < 1 µs. Use instead of ModPow(2, e, m) wherever possible.
|
||||
func ModPow2(e, m uint32) (x uint32) {
|
||||
/*
|
||||
m < 2 -> panic
|
||||
e == 0 -> x == 0
|
||||
e == 1 -> x == 1
|
||||
|
||||
2^M1 % M2 == 2^1 % 3 == 2^1 10 // 2^1, 3, 5, 7 ... +2k
|
||||
2^M1 % M3 == 2^1 % 7 == 2^1 010 // 2^1, 4, 7, ... +3k
|
||||
2^M1 % M4 == 2^1 % 15 == 2^1 0010 // 2^1, 5, 9, 13... +4k
|
||||
2^M1 % M5 == 2^1 % 31 == 2^1 00010 // 2^1, 6, 11, 16... +5k
|
||||
|
||||
2^M2 % M2 == 2^3 % 3 == 2^1 10.. // 2^3, 5, 7, 9, 11, ... +2k
|
||||
2^M2 % M3 == 2^3 % 7 == 2^0 001... // 2^3, 6, 9, 12, 15, ... +3k
|
||||
2^M2 % M4 == 2^3 % 15 == 2^3 1000 // 2^3, 7, 11, 15, 19, ... +4k
|
||||
2^M2 % M5 == 2^3 % 31 == 2^3 01000 // 2^3, 8, 13, 18, 23, ... +5k
|
||||
|
||||
2^M3 % M2 == 2^7 % 3 == 2^1 10..--.. // 2^3, 5, 7... +2k
|
||||
2^M3 % M3 == 2^7 % 7 == 2^1 010...--- // 2^1, 4, 7... +3k
|
||||
2^M3 % M4 == 2^7 % 15 == 2^3 1000.... // +4k
|
||||
2^M3 % M5 == 2^7 % 31 == 2^2 00100..... // +5k
|
||||
2^M3 % M6 == 2^7 % 63 == 2^1 000010...... // +6k
|
||||
2^M3 % M7 == 2^7 % 127 == 2^0 0000001.......
|
||||
2^M3 % M8 == 2^7 % 255 == 2^7 10000000
|
||||
2^M3 % M9 == 2^7 % 511 == 2^7 010000000
|
||||
|
||||
2^M4 % M2 == 2^15 % 3 == 2^1 10..--..--..--..
|
||||
2^M4 % M3 == 2^15 % 7 == 2^0 1...---...---...
|
||||
2^M4 % M4 == 2^15 % 15 == 2^3 1000....----....
|
||||
2^M4 % M5 == 2^15 % 31 == 2^0 1.....-----.....
|
||||
2^M4 % M6 == 2^15 % 63 == 2^3 1000......------
|
||||
2^M4 % M7 == 2^15 % 127 == 2^1 10.......-------
|
||||
2^M4 % M8 == 2^15 % 255 == 2^7 10000000........
|
||||
2^M4 % M9 == 2^15 % 511 == 2^6 1000000.........
|
||||
*/
|
||||
switch {
|
||||
case m < 2:
|
||||
panic(0)
|
||||
case e < 2:
|
||||
return e
|
||||
}
|
||||
|
||||
if x = mathutil.ModPowUint32(2, e, m); x == 0 {
|
||||
return m - 1
|
||||
}
|
||||
|
||||
return x - 1
|
||||
}
|
||||
|
||||
// ModPow returns b^Me % Mm. Run time grows quickly with 'e' and/or 'm' when b
|
||||
// != 2 (then ModPow2 is used).
|
||||
func ModPow(b, e, m uint32) (r *big.Int) {
|
||||
if m == 1 {
|
||||
return big.NewInt(0)
|
||||
}
|
||||
|
||||
if b == 2 {
|
||||
x := ModPow2(e, m)
|
||||
r = big.NewInt(0)
|
||||
r.SetBit(r, int(x), 1)
|
||||
return
|
||||
}
|
||||
|
||||
bb := big.NewInt(int64(b))
|
||||
r = big.NewInt(1)
|
||||
for ; e != 0; e-- {
|
||||
r = bigfft.Mul(r, bb)
|
||||
Mod(r, r, m)
|
||||
bb = bigfft.Mul(bb, bb)
|
||||
Mod(bb, bb, m)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// ProbablyPrime returns true if Mn is prime or is a pseudoprime to base a.
|
||||
// Note: Every Mp, prime p, is a prime or is a pseudoprime to base 2, actually
|
||||
// to every base 2^i, i ∊ [1, p). In contrast - it is conjectured (w/o any
|
||||
// known counterexamples) that no composite Mp, prime p, is a pseudoprime to
|
||||
// base 3.
|
||||
func ProbablyPrime(n, a uint32) bool {
|
||||
//TODO +test, +bench
|
||||
if a == 2 {
|
||||
return ModPow2(n-1, n) == 0
|
||||
}
|
||||
|
||||
nMinus1 := New(n)
|
||||
nMinus1.Sub(nMinus1, _1)
|
||||
x := ModPow(a, n-1, n)
|
||||
return x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0
|
||||
}
|
||||
39
vendor/github.com/cznic/mathutil/permute.go
generated
vendored
Normal file
39
vendor/github.com/cznic/mathutil/permute.go
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
// Generate the first permutation of data.
|
||||
func PermutationFirst(data sort.Interface) {
|
||||
sort.Sort(data)
|
||||
}
|
||||
|
||||
// Generate the next permutation of data if possible and return true.
|
||||
// Return false if there is no more permutation left.
|
||||
// Based on the algorithm described here:
|
||||
// http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
|
||||
func PermutationNext(data sort.Interface) bool {
|
||||
var k, l int
|
||||
for k = data.Len() - 2; ; k-- { // 1.
|
||||
if k < 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if data.Less(k, k+1) {
|
||||
break
|
||||
}
|
||||
}
|
||||
for l = data.Len() - 1; !data.Less(k, l); l-- { // 2.
|
||||
}
|
||||
data.Swap(k, l) // 3.
|
||||
for i, j := k+1, data.Len()-1; i < j; i++ { // 4.
|
||||
data.Swap(i, j)
|
||||
j--
|
||||
}
|
||||
return true
|
||||
}
|
||||
335
vendor/github.com/cznic/mathutil/primes.go
generated
vendored
Normal file
335
vendor/github.com/cznic/mathutil/primes.go
generated
vendored
Normal file
@@ -0,0 +1,335 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
import (
|
||||
"math"
|
||||
)
|
||||
|
||||
// IsPrimeUint16 returns true if n is prime. Typical run time is few ns.
|
||||
func IsPrimeUint16(n uint16) bool {
|
||||
return n > 0 && primes16[n-1] == 1
|
||||
}
|
||||
|
||||
// NextPrimeUint16 returns first prime > n and true if successful or an
|
||||
// undefined value and false if there is no next prime in the uint16 limits.
|
||||
// Typical run time is few ns.
|
||||
func NextPrimeUint16(n uint16) (p uint16, ok bool) {
|
||||
return n + uint16(primes16[n]), n < 65521
|
||||
}
|
||||
|
||||
// IsPrime returns true if n is prime. Typical run time is about 100 ns.
|
||||
//
|
||||
//TODO rename to IsPrimeUint32
|
||||
func IsPrime(n uint32) bool {
|
||||
switch {
|
||||
case n&1 == 0:
|
||||
return n == 2
|
||||
case n%3 == 0:
|
||||
return n == 3
|
||||
case n%5 == 0:
|
||||
return n == 5
|
||||
case n%7 == 0:
|
||||
return n == 7
|
||||
case n%11 == 0:
|
||||
return n == 11
|
||||
case n%13 == 0:
|
||||
return n == 13
|
||||
case n%17 == 0:
|
||||
return n == 17
|
||||
case n%19 == 0:
|
||||
return n == 19
|
||||
case n%23 == 0:
|
||||
return n == 23
|
||||
case n%29 == 0:
|
||||
return n == 29
|
||||
case n%31 == 0:
|
||||
return n == 31
|
||||
case n%37 == 0:
|
||||
return n == 37
|
||||
case n%41 == 0:
|
||||
return n == 41
|
||||
case n%43 == 0:
|
||||
return n == 43
|
||||
case n%47 == 0:
|
||||
return n == 47
|
||||
case n%53 == 0:
|
||||
return n == 53 // Benchmarked optimum
|
||||
case n < 65536:
|
||||
// use table data
|
||||
return IsPrimeUint16(uint16(n))
|
||||
default:
|
||||
mod := ModPowUint32(2, (n+1)/2, n)
|
||||
if mod != 2 && mod != n-2 {
|
||||
return false
|
||||
}
|
||||
blk := &lohi[n>>24]
|
||||
lo, hi := blk.lo, blk.hi
|
||||
for lo <= hi {
|
||||
index := (lo + hi) >> 1
|
||||
liar := liars[index]
|
||||
switch {
|
||||
case n > liar:
|
||||
lo = index + 1
|
||||
case n < liar:
|
||||
hi = index - 1
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// IsPrimeUint64 returns true if n is prime. Typical run time is few tens of µs.
|
||||
//
|
||||
// SPRP bases: http://miller-rabin.appspot.com
|
||||
func IsPrimeUint64(n uint64) bool {
|
||||
switch {
|
||||
case n%2 == 0:
|
||||
return n == 2
|
||||
case n%3 == 0:
|
||||
return n == 3
|
||||
case n%5 == 0:
|
||||
return n == 5
|
||||
case n%7 == 0:
|
||||
return n == 7
|
||||
case n%11 == 0:
|
||||
return n == 11
|
||||
case n%13 == 0:
|
||||
return n == 13
|
||||
case n%17 == 0:
|
||||
return n == 17
|
||||
case n%19 == 0:
|
||||
return n == 19
|
||||
case n%23 == 0:
|
||||
return n == 23
|
||||
case n%29 == 0:
|
||||
return n == 29
|
||||
case n%31 == 0:
|
||||
return n == 31
|
||||
case n%37 == 0:
|
||||
return n == 37
|
||||
case n%41 == 0:
|
||||
return n == 41
|
||||
case n%43 == 0:
|
||||
return n == 43
|
||||
case n%47 == 0:
|
||||
return n == 47
|
||||
case n%53 == 0:
|
||||
return n == 53
|
||||
case n%59 == 0:
|
||||
return n == 59
|
||||
case n%61 == 0:
|
||||
return n == 61
|
||||
case n%67 == 0:
|
||||
return n == 67
|
||||
case n%71 == 0:
|
||||
return n == 71
|
||||
case n%73 == 0:
|
||||
return n == 73
|
||||
case n%79 == 0:
|
||||
return n == 79
|
||||
case n%83 == 0:
|
||||
return n == 83
|
||||
case n%89 == 0:
|
||||
return n == 89 // Benchmarked optimum
|
||||
case n <= math.MaxUint16:
|
||||
return IsPrimeUint16(uint16(n))
|
||||
case n <= math.MaxUint32:
|
||||
return ProbablyPrimeUint32(uint32(n), 11000544) &&
|
||||
ProbablyPrimeUint32(uint32(n), 31481107)
|
||||
case n < 105936894253:
|
||||
return ProbablyPrimeUint64_32(n, 2) &&
|
||||
ProbablyPrimeUint64_32(n, 1005905886) &&
|
||||
ProbablyPrimeUint64_32(n, 1340600841)
|
||||
case n < 31858317218647:
|
||||
return ProbablyPrimeUint64_32(n, 2) &&
|
||||
ProbablyPrimeUint64_32(n, 642735) &&
|
||||
ProbablyPrimeUint64_32(n, 553174392) &&
|
||||
ProbablyPrimeUint64_32(n, 3046413974)
|
||||
case n < 3071837692357849:
|
||||
return ProbablyPrimeUint64_32(n, 2) &&
|
||||
ProbablyPrimeUint64_32(n, 75088) &&
|
||||
ProbablyPrimeUint64_32(n, 642735) &&
|
||||
ProbablyPrimeUint64_32(n, 203659041) &&
|
||||
ProbablyPrimeUint64_32(n, 3613982119)
|
||||
default:
|
||||
return ProbablyPrimeUint64_32(n, 2) &&
|
||||
ProbablyPrimeUint64_32(n, 325) &&
|
||||
ProbablyPrimeUint64_32(n, 9375) &&
|
||||
ProbablyPrimeUint64_32(n, 28178) &&
|
||||
ProbablyPrimeUint64_32(n, 450775) &&
|
||||
ProbablyPrimeUint64_32(n, 9780504) &&
|
||||
ProbablyPrimeUint64_32(n, 1795265022)
|
||||
}
|
||||
}
|
||||
|
||||
// NextPrime returns first prime > n and true if successful or an undefined value and false if there
|
||||
// is no next prime in the uint32 limits. Typical run time is about 2 µs.
|
||||
//
|
||||
//TODO rename to NextPrimeUint32
|
||||
func NextPrime(n uint32) (p uint32, ok bool) {
|
||||
switch {
|
||||
case n < 65521:
|
||||
p16, _ := NextPrimeUint16(uint16(n))
|
||||
return uint32(p16), true
|
||||
case n >= math.MaxUint32-4:
|
||||
return
|
||||
}
|
||||
|
||||
n++
|
||||
var d0, d uint32
|
||||
switch mod := n % 6; mod {
|
||||
case 0:
|
||||
d0, d = 1, 4
|
||||
case 1:
|
||||
d = 4
|
||||
case 2, 3, 4:
|
||||
d0, d = 5-mod, 2
|
||||
case 5:
|
||||
d = 2
|
||||
}
|
||||
|
||||
p = n + d0
|
||||
if p < n { // overflow
|
||||
return
|
||||
}
|
||||
|
||||
for {
|
||||
if IsPrime(p) {
|
||||
return p, true
|
||||
}
|
||||
|
||||
p0 := p
|
||||
p += d
|
||||
if p < p0 { // overflow
|
||||
break
|
||||
}
|
||||
|
||||
d ^= 6
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// NextPrimeUint64 returns first prime > n and true if successful or an undefined value and false if there
|
||||
// is no next prime in the uint64 limits. Typical run time is in hundreds of µs.
|
||||
func NextPrimeUint64(n uint64) (p uint64, ok bool) {
|
||||
switch {
|
||||
case n < 65521:
|
||||
p16, _ := NextPrimeUint16(uint16(n))
|
||||
return uint64(p16), true
|
||||
case n >= 18446744073709551557: // last uint64 prime
|
||||
return
|
||||
}
|
||||
|
||||
n++
|
||||
var d0, d uint64
|
||||
switch mod := n % 6; mod {
|
||||
case 0:
|
||||
d0, d = 1, 4
|
||||
case 1:
|
||||
d = 4
|
||||
case 2, 3, 4:
|
||||
d0, d = 5-mod, 2
|
||||
case 5:
|
||||
d = 2
|
||||
}
|
||||
|
||||
p = n + d0
|
||||
if p < n { // overflow
|
||||
return
|
||||
}
|
||||
|
||||
for {
|
||||
if ok = IsPrimeUint64(p); ok {
|
||||
break
|
||||
}
|
||||
|
||||
p0 := p
|
||||
p += d
|
||||
if p < p0 { // overflow
|
||||
break
|
||||
}
|
||||
|
||||
d ^= 6
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// FactorTerm is one term of an integer factorization.
|
||||
type FactorTerm struct {
|
||||
Prime uint32 // The divisor
|
||||
Power uint32 // Term == Prime^Power
|
||||
}
|
||||
|
||||
// FactorTerms represent a factorization of an integer
|
||||
type FactorTerms []FactorTerm
|
||||
|
||||
// FactorInt returns prime factorization of n > 1 or nil otherwise.
|
||||
// Resulting factors are ordered by Prime. Typical run time is few µs.
|
||||
func FactorInt(n uint32) (f FactorTerms) {
|
||||
switch {
|
||||
case n < 2:
|
||||
return
|
||||
case IsPrime(n):
|
||||
return []FactorTerm{{n, 1}}
|
||||
}
|
||||
|
||||
f, w := make([]FactorTerm, 9), 0
|
||||
for p := 2; p < len(primes16); p += int(primes16[p]) {
|
||||
if uint(p*p) > uint(n) {
|
||||
break
|
||||
}
|
||||
|
||||
power := uint32(0)
|
||||
for n%uint32(p) == 0 {
|
||||
n /= uint32(p)
|
||||
power++
|
||||
}
|
||||
if power != 0 {
|
||||
f[w] = FactorTerm{uint32(p), power}
|
||||
w++
|
||||
}
|
||||
if n == 1 {
|
||||
break
|
||||
}
|
||||
}
|
||||
if n != 1 {
|
||||
f[w] = FactorTerm{n, 1}
|
||||
w++
|
||||
}
|
||||
return f[:w]
|
||||
}
|
||||
|
||||
// PrimorialProductsUint32 returns a slice of numbers in [lo, hi] which are a
|
||||
// product of max 'max' primorials. The slice is not sorted.
|
||||
//
|
||||
// See also: http://en.wikipedia.org/wiki/Primorial
|
||||
func PrimorialProductsUint32(lo, hi, max uint32) (r []uint32) {
|
||||
lo64, hi64 := int64(lo), int64(hi)
|
||||
if max > 31 { // N/A
|
||||
max = 31
|
||||
}
|
||||
|
||||
var f func(int64, int64, uint32)
|
||||
f = func(n, p int64, emax uint32) {
|
||||
e := uint32(1)
|
||||
for n <= hi64 && e <= emax {
|
||||
n *= p
|
||||
if n >= lo64 && n <= hi64 {
|
||||
r = append(r, uint32(n))
|
||||
}
|
||||
if n < hi64 {
|
||||
p, _ := NextPrime(uint32(p))
|
||||
f(n, int64(p), e)
|
||||
}
|
||||
e++
|
||||
}
|
||||
}
|
||||
|
||||
f(1, 2, max)
|
||||
return
|
||||
}
|
||||
27
vendor/github.com/cznic/mathutil/rat.go
generated
vendored
Normal file
27
vendor/github.com/cznic/mathutil/rat.go
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
// QCmpUint32 compares a/b and c/d and returns:
|
||||
//
|
||||
// -1 if a/b < c/d
|
||||
// 0 if a/b == c/d
|
||||
// +1 if a/b > c/d
|
||||
//
|
||||
func QCmpUint32(a, b, c, d uint32) int {
|
||||
switch x, y := uint64(a)*uint64(d), uint64(b)*uint64(c); {
|
||||
case x < y:
|
||||
return -1
|
||||
case x == y:
|
||||
return 0
|
||||
default: // x > y
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
// QScaleUint32 returns a such that a/b >= c/d.
|
||||
func QScaleUint32(b, c, d uint32) (a uint64) {
|
||||
return 1 + (uint64(b)*uint64(c))/uint64(d)
|
||||
}
|
||||
383
vendor/github.com/cznic/mathutil/rnd.go
generated
vendored
Normal file
383
vendor/github.com/cznic/mathutil/rnd.go
generated
vendored
Normal file
@@ -0,0 +1,383 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
// FC32 is a full cycle PRNG covering the 32 bit signed integer range.
|
||||
// In contrast to full cycle generators shown at e.g. http://en.wikipedia.org/wiki/Full_cycle,
|
||||
// this code doesn't produce values at constant delta (mod cycle length).
|
||||
// The 32 bit limit is per this implementation, the algorithm used has no intrinsic limit on the cycle size.
|
||||
// Properties include:
|
||||
// - Adjustable limits on creation (hi, lo).
|
||||
// - Positionable/randomly accessible (Pos, Seek).
|
||||
// - Repeatable (deterministic).
|
||||
// - Can run forward or backward (Next, Prev).
|
||||
// - For a billion numbers cycle the Next/Prev PRN can be produced in cca 100-150ns.
|
||||
// That's like 5-10 times slower compared to PRNs generated using the (non FC) rand package.
|
||||
type FC32 struct {
|
||||
cycle int64 // On average: 3 * delta / 2, (HQ: 2 * delta)
|
||||
delta int64 // hi - lo
|
||||
factors [][]int64 // This trades some space for hopefully a bit of speed (multiple adding vs multiplying).
|
||||
lo int
|
||||
mods []int // pos % set
|
||||
pos int64 // Within cycle.
|
||||
primes []int64 // Ordered. ∏ primes == cycle.
|
||||
set []int64 // Reordered primes (magnitude order bases) according to seed.
|
||||
}
|
||||
|
||||
// NewFC32 returns a newly created FC32 adjusted for the closed interval [lo, hi] or an Error if any.
|
||||
// If hq == true then trade some generation time for improved (pseudo)randomness.
|
||||
func NewFC32(lo, hi int, hq bool) (r *FC32, err error) {
|
||||
if lo > hi {
|
||||
return nil, fmt.Errorf("invalid range %d > %d", lo, hi)
|
||||
}
|
||||
|
||||
if uint64(hi)-uint64(lo) > math.MaxUint32 {
|
||||
return nil, fmt.Errorf("range out of int32 limits %d, %d", lo, hi)
|
||||
}
|
||||
|
||||
delta := int64(hi) - int64(lo)
|
||||
// Find the primorial covering whole delta
|
||||
n, set, p := int64(1), []int64{}, uint32(2)
|
||||
if hq {
|
||||
p++
|
||||
}
|
||||
for {
|
||||
set = append(set, int64(p))
|
||||
n *= int64(p)
|
||||
if n > delta {
|
||||
break
|
||||
}
|
||||
p, _ = NextPrime(p)
|
||||
}
|
||||
|
||||
// Adjust the set so n ∊ [delta, 2 * delta] (HQ: [delta, 3 * delta])
|
||||
// while keeping the cardinality of the set (correlates with the statistic "randomness quality")
|
||||
// at max, i.e. discard atmost one member.
|
||||
i := -1 // no candidate prime
|
||||
if n > 2*(delta+1) {
|
||||
for j, p := range set {
|
||||
q := n / p
|
||||
if q < delta+1 {
|
||||
break
|
||||
}
|
||||
|
||||
i = j // mark the highest candidate prime set index
|
||||
}
|
||||
}
|
||||
if i >= 0 { // shrink the inner cycle
|
||||
n = n / set[i]
|
||||
set = delete(set, i)
|
||||
}
|
||||
r = &FC32{
|
||||
cycle: n,
|
||||
delta: delta,
|
||||
factors: make([][]int64, len(set)),
|
||||
lo: lo,
|
||||
mods: make([]int, len(set)),
|
||||
primes: set,
|
||||
}
|
||||
r.Seed(1) // the default seed should be always non zero
|
||||
return
|
||||
}
|
||||
|
||||
// Cycle reports the length of the inner FCPRNG cycle.
|
||||
// Cycle is atmost the double (HQ: triple) of the generator period (hi - lo + 1).
|
||||
func (r *FC32) Cycle() int64 {
|
||||
return r.cycle
|
||||
}
|
||||
|
||||
// Next returns the first PRN after Pos.
|
||||
func (r *FC32) Next() int {
|
||||
return r.step(1)
|
||||
}
|
||||
|
||||
// Pos reports the current position within the inner cycle.
|
||||
func (r *FC32) Pos() int64 {
|
||||
return r.pos
|
||||
}
|
||||
|
||||
// Prev return the first PRN before Pos.
|
||||
func (r *FC32) Prev() int {
|
||||
return r.step(-1)
|
||||
}
|
||||
|
||||
// Seed uses the provided seed value to initialize the generator to a deterministic state.
|
||||
// A zero seed produces a "canonical" generator with worse randomness than for most non zero seeds.
|
||||
// Still, the FC property holds for any seed value.
|
||||
func (r *FC32) Seed(seed int64) {
|
||||
u := uint64(seed)
|
||||
r.set = mix(r.primes, &u)
|
||||
n := int64(1)
|
||||
for i, p := range r.set {
|
||||
k := make([]int64, p)
|
||||
v := int64(0)
|
||||
for j := range k {
|
||||
k[j] = v
|
||||
v += n
|
||||
}
|
||||
n *= p
|
||||
r.factors[i] = mix(k, &u)
|
||||
}
|
||||
}
|
||||
|
||||
// Seek sets Pos to |pos| % Cycle.
|
||||
func (r *FC32) Seek(pos int64) { //vet:ignore
|
||||
if pos < 0 {
|
||||
pos = -pos
|
||||
}
|
||||
pos %= r.cycle
|
||||
r.pos = pos
|
||||
for i, p := range r.set {
|
||||
r.mods[i] = int(pos % p)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *FC32) step(dir int) int {
|
||||
for { // avg loops per step: 3/2 (HQ: 2)
|
||||
y := int64(0)
|
||||
pos := r.pos
|
||||
pos += int64(dir)
|
||||
switch {
|
||||
case pos < 0:
|
||||
pos = r.cycle - 1
|
||||
case pos >= r.cycle:
|
||||
pos = 0
|
||||
}
|
||||
r.pos = pos
|
||||
for i, mod := range r.mods {
|
||||
mod += dir
|
||||
p := int(r.set[i])
|
||||
switch {
|
||||
case mod < 0:
|
||||
mod = p - 1
|
||||
case mod >= p:
|
||||
mod = 0
|
||||
}
|
||||
r.mods[i] = mod
|
||||
y += r.factors[i][mod]
|
||||
}
|
||||
if y <= r.delta {
|
||||
return int(y) + r.lo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func delete(set []int64, i int) (y []int64) {
|
||||
for j, v := range set {
|
||||
if j != i {
|
||||
y = append(y, v)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func mix(set []int64, seed *uint64) (y []int64) {
|
||||
for len(set) != 0 {
|
||||
*seed = rol(*seed)
|
||||
i := int(*seed % uint64(len(set)))
|
||||
y = append(y, set[i])
|
||||
set = delete(set, i)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func rol(u uint64) (y uint64) {
|
||||
y = u << 1
|
||||
if int64(u) < 0 {
|
||||
y |= 1
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// FCBig is a full cycle PRNG covering ranges outside of the int32 limits.
|
||||
// For more info see the FC32 docs.
|
||||
// Next/Prev PRN on a 1e15 cycle can be produced in about 2 µsec.
|
||||
type FCBig struct {
|
||||
cycle *big.Int // On average: 3 * delta / 2, (HQ: 2 * delta)
|
||||
delta *big.Int // hi - lo
|
||||
factors [][]*big.Int // This trades some space for hopefully a bit of speed (multiple adding vs multiplying).
|
||||
lo *big.Int
|
||||
mods []int // pos % set
|
||||
pos *big.Int // Within cycle.
|
||||
primes []int64 // Ordered. ∏ primes == cycle.
|
||||
set []int64 // Reordered primes (magnitude order bases) according to seed.
|
||||
}
|
||||
|
||||
// NewFCBig returns a newly created FCBig adjusted for the closed interval [lo, hi] or an Error if any.
|
||||
// If hq == true then trade some generation time for improved (pseudo)randomness.
|
||||
func NewFCBig(lo, hi *big.Int, hq bool) (r *FCBig, err error) {
|
||||
if lo.Cmp(hi) > 0 {
|
||||
return nil, fmt.Errorf("invalid range %d > %d", lo, hi)
|
||||
}
|
||||
|
||||
delta := big.NewInt(0)
|
||||
delta.Add(delta, hi).Sub(delta, lo)
|
||||
|
||||
// Find the primorial covering whole delta
|
||||
n, set, pp, p := big.NewInt(1), []int64{}, big.NewInt(0), uint32(2)
|
||||
if hq {
|
||||
p++
|
||||
}
|
||||
for {
|
||||
set = append(set, int64(p))
|
||||
pp.SetInt64(int64(p))
|
||||
n.Mul(n, pp)
|
||||
if n.Cmp(delta) > 0 {
|
||||
break
|
||||
}
|
||||
p, _ = NextPrime(p)
|
||||
}
|
||||
|
||||
// Adjust the set so n ∊ [delta, 2 * delta] (HQ: [delta, 3 * delta])
|
||||
// while keeping the cardinality of the set (correlates with the statistic "randomness quality")
|
||||
// at max, i.e. discard atmost one member.
|
||||
dd1 := big.NewInt(1)
|
||||
dd1.Add(dd1, delta)
|
||||
dd2 := big.NewInt(0)
|
||||
dd2.Lsh(dd1, 1)
|
||||
i := -1 // no candidate prime
|
||||
if n.Cmp(dd2) > 0 {
|
||||
q := big.NewInt(0)
|
||||
for j, p := range set {
|
||||
pp.SetInt64(p)
|
||||
q.Set(n)
|
||||
q.Div(q, pp)
|
||||
if q.Cmp(dd1) < 0 {
|
||||
break
|
||||
}
|
||||
|
||||
i = j // mark the highest candidate prime set index
|
||||
}
|
||||
}
|
||||
if i >= 0 { // shrink the inner cycle
|
||||
pp.SetInt64(set[i])
|
||||
n.Div(n, pp)
|
||||
set = delete(set, i)
|
||||
}
|
||||
r = &FCBig{
|
||||
cycle: n,
|
||||
delta: delta,
|
||||
factors: make([][]*big.Int, len(set)),
|
||||
lo: lo,
|
||||
mods: make([]int, len(set)),
|
||||
pos: big.NewInt(0),
|
||||
primes: set,
|
||||
}
|
||||
r.Seed(1) // the default seed should be always non zero
|
||||
return
|
||||
}
|
||||
|
||||
// Cycle reports the length of the inner FCPRNG cycle.
|
||||
// Cycle is atmost the double (HQ: triple) of the generator period (hi - lo + 1).
|
||||
func (r *FCBig) Cycle() *big.Int {
|
||||
return r.cycle
|
||||
}
|
||||
|
||||
// Next returns the first PRN after Pos.
|
||||
func (r *FCBig) Next() *big.Int {
|
||||
return r.step(1)
|
||||
}
|
||||
|
||||
// Pos reports the current position within the inner cycle.
|
||||
func (r *FCBig) Pos() *big.Int {
|
||||
return r.pos
|
||||
}
|
||||
|
||||
// Prev return the first PRN before Pos.
|
||||
func (r *FCBig) Prev() *big.Int {
|
||||
return r.step(-1)
|
||||
}
|
||||
|
||||
// Seed uses the provided seed value to initialize the generator to a deterministic state.
|
||||
// A zero seed produces a "canonical" generator with worse randomness than for most non zero seeds.
|
||||
// Still, the FC property holds for any seed value.
|
||||
func (r *FCBig) Seed(seed int64) {
|
||||
u := uint64(seed)
|
||||
r.set = mix(r.primes, &u)
|
||||
n := big.NewInt(1)
|
||||
v := big.NewInt(0)
|
||||
pp := big.NewInt(0)
|
||||
for i, p := range r.set {
|
||||
k := make([]*big.Int, p)
|
||||
v.SetInt64(0)
|
||||
for j := range k {
|
||||
k[j] = big.NewInt(0)
|
||||
k[j].Set(v)
|
||||
v.Add(v, n)
|
||||
}
|
||||
pp.SetInt64(p)
|
||||
n.Mul(n, pp)
|
||||
r.factors[i] = mixBig(k, &u)
|
||||
}
|
||||
}
|
||||
|
||||
// Seek sets Pos to |pos| % Cycle.
|
||||
func (r *FCBig) Seek(pos *big.Int) {
|
||||
r.pos.Set(pos)
|
||||
r.pos.Abs(r.pos)
|
||||
r.pos.Mod(r.pos, r.cycle)
|
||||
mod := big.NewInt(0)
|
||||
pp := big.NewInt(0)
|
||||
for i, p := range r.set {
|
||||
pp.SetInt64(p)
|
||||
r.mods[i] = int(mod.Mod(r.pos, pp).Int64())
|
||||
}
|
||||
}
|
||||
|
||||
func (r *FCBig) step(dir int) (y *big.Int) {
|
||||
y = big.NewInt(0)
|
||||
d := big.NewInt(int64(dir))
|
||||
for { // avg loops per step: 3/2 (HQ: 2)
|
||||
r.pos.Add(r.pos, d)
|
||||
switch {
|
||||
case r.pos.Sign() < 0:
|
||||
r.pos.Add(r.pos, r.cycle)
|
||||
case r.pos.Cmp(r.cycle) >= 0:
|
||||
r.pos.SetInt64(0)
|
||||
}
|
||||
for i, mod := range r.mods {
|
||||
mod += dir
|
||||
p := int(r.set[i])
|
||||
switch {
|
||||
case mod < 0:
|
||||
mod = p - 1
|
||||
case mod >= p:
|
||||
mod = 0
|
||||
}
|
||||
r.mods[i] = mod
|
||||
y.Add(y, r.factors[i][mod])
|
||||
}
|
||||
if y.Cmp(r.delta) <= 0 {
|
||||
y.Add(y, r.lo)
|
||||
return
|
||||
}
|
||||
y.SetInt64(0)
|
||||
}
|
||||
}
|
||||
|
||||
func deleteBig(set []*big.Int, i int) (y []*big.Int) {
|
||||
for j, v := range set {
|
||||
if j != i {
|
||||
y = append(y, v)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func mixBig(set []*big.Int, seed *uint64) (y []*big.Int) {
|
||||
for len(set) != 0 {
|
||||
*seed = rol(*seed)
|
||||
i := int(*seed % uint64(len(set)))
|
||||
y = append(y, set[i])
|
||||
set = deleteBig(set, i)
|
||||
}
|
||||
return
|
||||
}
|
||||
6995
vendor/github.com/cznic/mathutil/tables.go
generated
vendored
Normal file
6995
vendor/github.com/cznic/mathutil/tables.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
11
vendor/github.com/cznic/mathutil/test_deps.go
generated
vendored
Normal file
11
vendor/github.com/cznic/mathutil/test_deps.go
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright (c) 2014 The mathutil Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package mathutil
|
||||
|
||||
// Pull test dependencies too.
|
||||
// Enables easy 'go test X' after 'go get X'
|
||||
import (
|
||||
// nothing yet
|
||||
)
|
||||
Reference in New Issue
Block a user