With n1 and n2 two positive integers, the formula
L=498∑k=0(n1+n2k)(106)k
can construct very large numbers L.
Once we have L we can let n vary from 1 to 1,000,000 and construct residues
n \mapsto [L \pmod n] \pmod {53}
The residues will all belong to \{0,1,2,\dots,52\}. Since we are taking 1,000,000 residues, you might guess that each residue will occur around \frac{10^6}{53} \approx 18,868 times, but this is not the case.
I wrote a Python program (see next section) and found the following distributions:
Please input big number seed 1: 1
Please input big number seed 2: 2
seeds = 1 2
[(16, 37359), (25, 19262), (4, 19164), (13, 19153), (26, 18985), (1, 18972), (41, 18885), (15, 18855), (12, 18814), (7, 18766), (46, 18766), (29, 18755), (50, 18746), (20, 18735), (10, 18716), (39, 18701), (9, 18638), (33, 18638), (45, 18626), (48, 18575), (18, 18573), (43, 18569), (31, 18527), (22, 18511), (5, 18509), (2, 18459), (8, 18454), (38, 18449), (21, 18443), (0, 18440), (34, 18430), (49, 18422), (23, 18416), (47, 18413), (35, 18409), (17, 18405), (42, 18401), (27, 18400), (36, 18399), (28, 18321), (32, 18320), (14, 18302), (3, 18294), (24, 18278), (44, 18167), (30, 18162), (19, 18153), (40, 18152), (52, 18123), (37, 18083), (11, 18068), (51, 17996), (6, 17841)]
Please input big number seed 1: 123
Please input big number seed 2: 321
seeds = 123 321
[(48, 36932), (13, 19246), (2, 19144), (18, 19060), (29, 19047), (42, 18992), (49, 18840), (21, 18830), (47, 18801), (22, 18797), (39, 18768), (20, 18767), (3, 18734), (1, 18698), (52, 18693), (15, 18679), (25, 18675), (5, 18661), (0, 18655), (28, 18629), (7, 18628), (17, 18623), (32, 18613), (8, 18608), (46, 18604), (19, 18593), (33, 18562), (4, 18531), (51, 18497), (9, 18496), (14, 18477), (38, 18476), (36, 18443), (30, 18439), (44, 18408), (23, 18382), (24, 18372), (41, 18371), (43, 18327), (45, 18314), (34, 18269), (11, 18208), (26, 18207), (31, 18164), (35, 18148), (37, 18145), (10, 18133), (50, 18117), (27, 18112), (12, 18063), (40, 18035), (6, 18012), (16, 17975)]
Please input big number seed 1: 88
Please input big number seed 2: 78
seeds = 88 78
[(16, 37746), (7, 19142), (40, 19121), (23, 19050), (38, 18929), (51, 18921), (42, 18904), (1, 18845), (20, 18826), (15, 18761), (39, 18758), (41, 18748), (4, 18746), (6, 18697), (0, 18663), (31, 18652), (11, 18646), (48, 18617), (17, 18580), (22, 18569), (9, 18563), (12, 18559), (24, 18541), (26, 18516), (8, 18509), (45, 18491), (36, 18489), (28, 18474), (32, 18447), (25, 18446), (37, 18438), (50, 18433), (52, 18430), (46, 18394), (49, 18383), (18, 18356), (29, 18356), (14, 18337), (3, 18328), (43, 18318), (33, 18314), (10, 18286), (13, 18261), (19, 18260), (44, 18221), (2, 18219), (47, 18201), (5, 18178), (34, 18175), (21, 18144), (35, 18088), (30, 17964), (27, 17960)]
Notice how the first most common residues stand out:
(16, 37359)
(48, 36932)
(16, 37746)
in each of the three programs runs.
I started out using \text{mod } 50 and that pattern was really weird so I tried using the prime number 53. It works better but still not looking uniform.
Any explanation for this distribution pattern?
My work and motivation
I'm interested in cryptography and was thinking that if two parties shared a secret large number L they could transmit n to represent one of, say, 53 characters.
So with seeds = 1,\, 2 and (25, 19262) counter output, you have 19,262 different choices for n to transmit the 25^{th} character of your 'alphabet'. Of course you can find more n by going past the (artificially} selected one million mark.
Any answers/comments on the strengths and weaknesses of this idea would be appreciated.
Python program (not optimized)
M = 1000000
def bP(i):
p = 1
for j in range(0, i):
p = (p * M)
return p
def getTerm(i):
return ((n1 + n2 * i) * bP(i))
import collections
while True:
print()
n1 = int(input('Please input big number seed 1: '))
n2 = int(input('Please input big number seed 2: '))
print('seeds =',n1,n2)
L = 0
for i in range(0, 499):
L = (L + getTerm(i))
cnt = collections.Counter()
for n in range(1, 1000001):
c = (L % n) % 53
cnt[c] += 1
print(cnt.most_common())
No comments:
Post a Comment