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 }