Я столкнулся с проблемой поиска указанной вероятности, и моей первой попыткой было найти следующий алгоритм: я считаю количество пар относительно простых.
int rel = 0
int total = n * (n - 1) / 2
for i in [1, n)
for j in [i+1, n)
if gcd(i, j) == 1
++rel;
return rel / total
, что O (n ^ 2) .
Вот моя попытка уменьшить сложность:
Наблюдение (1): 1 относительно простое по отношению к [2, n]
, поэтому пары n - 1
тривиальны.
Замечание (2): 2 не является относительно простым числом к четным числам в диапазоне [4, n]
, поэтому оставшиеся нечетные числа относительно простые числа к 2, поэтому
#Relatively prime pairs = (n / 2) if n is even
= (n / 2 - 1) if n is odd.
Так что мой улучшенный алгоритм будет:
int total = n * (n - 1) / 2
int rel = 0
if (n % 2) // n is odd
rel = (n - 1) + n / 2 - 1
else // n is even
rel = (n - 1) + n / 2
for i in [3, n)
for j in [i+1, n)
if gcd(i, j) == 1
++rel;
return rel / total
При таком подходе я мог бы уменьшить два цикла, но наихудшая временная сложность все равно O(n^2)
.
Вопрос: Мой вопрос: можем ли мы использовать какие-либо математические свойства, кроме указанных выше, для нахождения желаемой вероятности в линейном времени?
Спасибо.