Encontré este problema de encontrar dicha probabilidad y mi primer intento fue crear el siguiente algoritmo: Estoy contando el número de pares que son relativamente primos .Halla la probabilidad de que dos enteros aleatoriamente seleccionados (de n enteros) sean relativamente primos
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
que es O (n^2).
Aquí está mi intento de reducir la complejidad:
Observación (1): 1 es primo relativo a [2, n]
por lo n - 1
pares son triviales.
Observación (2): 2 no es primo relativo a los números pares en el rango [4, n]
por lo que quedan los números impares son primos entre sí a 2, por lo
#Relatively prime pairs = (n/2) if n is even
= (n/2 - 1) if n is odd.
Así que mi algoritmo mejorado sería:
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
Con este enfoque podría reducir dos bucles, pero la peor complejidad de tiempo de caso sigue siendo O(n^2)
.
Pregunta: Mi pregunta es si podemos aprovechar cualquier otra característica matemática que no sea la anterior para encontrar la probabilidad deseada en tiempo lineal.
Gracias.
¿Cuál es la distribución de sus n enteros? ¿Estos enteros aleatorios distribuidos uniformemente, o algo más? Quizás hacer tu pregunta en http://math.stackexchange.com/ sería más fructífero. – 9000
Mi entrada sería: para n = 10, matriz: [1 ... n] o [1,2,3,4,5,6,7,8,9,10] –