github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/args/primes.go (about)

     1  // Copyright 2020 Insolar Network Ltd.
     2  // All rights reserved.
     3  // This material is licensed under the Insolar License version 1.0,
     4  // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md.
     5  
     6  package args
     7  
     8  import "sort"
     9  
    10  const PrimeCount = 6550
    11  const MaxPrime = 65581
    12  
    13  func Prime(i int) int {
    14  	switch n := len(primes); {
    15  	case i >= n:
    16  		return int(primesOverUint16[i-n])
    17  	default:
    18  		return int(primes[i])
    19  	}
    20  }
    21  
    22  func Primes() PrimeList {
    23  	return allPrimes
    24  }
    25  
    26  func OddPrimes() PrimeList {
    27  	return oddPrimes
    28  }
    29  
    30  func IsolatedOddPrimes() PrimeList {
    31  	return isolatedOddPrimes
    32  }
    33  
    34  var allPrimes = PrimeList{primes, primesOverUint16[0]}
    35  var oddPrimes = PrimeList{primes[1:], primesOverUint16[0]}
    36  var isolatedOddPrimes = PrimeList{isolatedPrimes[1:], isolatedPrimeOverUint16[0]}
    37  
    38  type PrimeList struct {
    39  	primes   []uint16
    40  	maxPrime uint
    41  }
    42  
    43  func (m PrimeList) search(v int) uint {
    44  	return uint(sort.Search(len(m.primes), func(i int) bool { return int(m.primes[i]) >= v }))
    45  }
    46  
    47  func (m PrimeList) Len() int {
    48  	return len(m.primes) + 1
    49  }
    50  
    51  func (m PrimeList) Prime(i int) int {
    52  	if len(m.primes) == i {
    53  		return int(m.maxPrime)
    54  	}
    55  	return int(m.primes[i])
    56  }
    57  
    58  func (m PrimeList) Ceiling(v int) int {
    59  	return m.Prime(int(m.search(v)))
    60  }
    61  
    62  func (m PrimeList) Floor(v int) int {
    63  	switch n := m.search(v); {
    64  	case n == 0:
    65  		return int(m.primes[0])
    66  	case n == uint(len(m.primes)):
    67  		if v >= int(m.maxPrime) {
    68  			return int(m.maxPrime)
    69  		}
    70  		return int(m.primes[len(m.primes)-1])
    71  	case int(m.primes[n]) == v:
    72  		return v
    73  	default:
    74  		return int(m.primes[n-1])
    75  	}
    76  }
    77  
    78  func (m PrimeList) Nearest(v int) int {
    79  	switch n := m.search(v); {
    80  	case n == 0:
    81  		return int(m.primes[0])
    82  	case n == uint(len(m.primes)):
    83  		return int(m.maxPrime)
    84  	case (v - int(m.primes[n-1])) <= (int(m.primes[n]) - v):
    85  		return int(m.primes[n-1])
    86  	default:
    87  		return int(m.primes[n])
    88  	}
    89  }
    90  
    91  func (m PrimeList) Max() int {
    92  	return int(m.maxPrime)
    93  }
    94  
    95  func (m PrimeList) Min() int {
    96  	return int(m.primes[0])
    97  }