需要給三個值
- MAX = 99999999 # 給一個所需的總數
- PRIME_NUMBER = 549755813887 # 給一個質數
def inverse(a, n)
t = 0 ; newt = 1
r = n ; newr = a
while newr != 0
quotient = r / newr
t , newt = newt , t - quotient * newt
r , newr = newr , r - quotient * newr
end
return "a is not invertible" if r > 1
return t < 0 ? t + n : t
end
> inverse(PRIME_NUMBER, MAX)
=> 20654203
- PRIME_NUMBER_INVERSE = 20654203
def int2serial(source)
return source.to_i * PRIME_NUMBER % MAX
end
def serial2int(source)
return source.to_i * PRIME_NUMBER_INVERSE % MAX
end
> (1..20).each do |a|
> puts "#{a} : #{int2serial(a)} : #{serial2int(int2serial(a))}"
> end
1 : 55819384 : 1
2 : 11638769 : 2
3 : 67458153 : 3
4 : 23277538 : 4
5 : 79096922 : 5
6 : 34916307 : 6
7 : 90735691 : 7
8 : 46555076 : 8
9 : 2374461 : 9
10 : 58193845 : 10
11 : 14013230 : 11
12 : 69832614 : 12
13 : 25651999 : 13
14 : 81471383 : 14
15 : 37290768 : 15
16 : 93110152 : 16
17 : 48929537 : 17
18 : 4748922 : 18
19 : 60568306 : 19
20 : 16387691 : 20
# 基本上不特別處理是無法得知 55819384 原始值是 1