-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrandom_numbers.go
More file actions
67 lines (55 loc) · 1.71 KB
/
random_numbers.go
File metadata and controls
67 lines (55 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package crypto_math
import (
"math/big"
rnd "math/rand"
"time"
)
// RandNumber - Генерация k-битного случайного нечетного числа.
//
// Вход: Разрядность k генерируемого числа.
//
// Выход: Случайное k-битное нечетное число.
func RandNumber(k int) (result *big.Int) {
// Проверка входных данных
if k <= 1 {
panic("k > 1")
}
randNumber := new(big.Int)
// Получаем k битное число из 1: 1000...001
randNumber = randNumber.SetBit(randNumber, k-1, 1)
randNumber = randNumber.SetBit(randNumber, 0, 1)
// Случайные числа
rnd.Seed(time.Now().UnixNano())
// Побитовая догенерация случайного числа с помощью OR
for i := 1; i < randNumber.BitLen()-1; i++ {
bit := rnd.Int31n(2)
if bit == 1 {
randNumber = randNumber.SetBit(randNumber, i, uint(bit))
}
}
return randNumber
}
// SimpleNumber - Генерация k-битного простого числа.
//
// Вход: Разрядность k искомого простого числа, параметр t >= 1.
//
// Выход: Число, простое с вероятностью 1 - 1 / (4**t).
func SimpleNumber(k int, t int) (result *big.Int) {
// Проверка входных данных
if k <= 1 {
panic("k > 1")
}
if t < 1 {
panic("t >= 1")
}
// Генерируем случайное нечетное k-битное число
randNumber := new(big.Int)
randNumber = RandNumber(k)
for i := 0; i < t; i++ {
if !MillerRabinTest(randNumber) {
randNumber = randNumber.Add(randNumber, constNum1)
i = 0
}
}
return randNumber
}