[英]Complexity of the script (finding a pair of integers which have the same remainder in modulo)
[英]Efficiency of the script (finding a pair of integers which have the same remainder)
我試圖在 A 中找到一對 (x,y),使得 xy = 0 (mod n),其中輸入為正 integer n,一組由 m 個非負整數和 m > n 組成的 A。 為了運行下面的代碼,我拿了一個 m 和 n 只是為了運行一個例子。
下面是我寫的腳本。
我想知道是否有更有效的方法來編寫腳本
import numpy as np import sys
n = 10
m = 12
def functi(n, m):
A = [0] * m
for i in range(m):
A[i] = np.random.randint(0,34)
X = [-1] * n
for i in range(len(A)-1,-1,-1) : #loop backwards
a = A[i]
A.pop(i)
r = a % n
if X[r] == -1:
X[r] = a
else:
return(X[r], a)
pair = functi(n, m)
print(pair)
請注意,您的 function 沒有問題描述的參數 - 它應該將n
和A
作為參數,而不是采用m
並生成自己的A
。
如果您將其簡單地視為“找到一對具有相同值 mod n 的數字”,則問題會容易得多。 一個簡單的方法是根據它們的值% n
對所有數字進行存儲,並在其中包含兩個數字時返回一個存儲桶。 這樣您就不需要單獨比較每對值來查看它們是否匹配。
>>> import random
>>> def find_equal_pair_mod_n(n, A):
... assert len(A) > n
... mods = {}
... for i in A:
... xy = mods.setdefault(i % n, [])
... xy.append(i)
... if len(xy) > 1:
... return tuple(xy)
...
>>> find_equal_pair_mod_n(10, [random.randint(0, 34) for _ in range(12)])
(26, 6)
>>> find_equal_pair_mod_n(10, [random.randint(0, 34) for _ in range(12)])
(30, 10)
>>> find_equal_pair_mod_n(10, [random.randint(0, 34) for _ in range(12)])
(32, 32)
>>> find_equal_pair_mod_n(10, [random.randint(0, 34) for _ in range(12)])
(1, 1)
>>> find_equal_pair_mod_n(10, [random.randint(0, 34) for _ in range(12)])
(28, 8)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.