Esta resposta considera um modelo diferente de computação: o modelo de RAM de custo unitário. Nesse modelo, as palavras de máquina têm o tamanho e as operações nelas levam tempo O ( 1 ) . Também assumimos por simplicidade que cada elemento da matriz se encaixa em uma palavra de máquina (e, portanto, é no máximo n O ( 1 ) em magnitude).O(logn)O(1)nO(1)
Vamos construir um tempo linear randomizados algoritmo com unilateral de erro (o algoritmo pode declarar as duas matrizes para conter os mesmos elementos, mesmo que este não é o caso) para o problema mais difícil de determinar se duas matrizes e b 1 , … , b n contêm os mesmos elementos. (Não exigimos que nenhuma delas seja classificada.) Nosso algoritmo cometerá um erro com probabilidade no máximo 1 / n .a1,…,anb1,…,bn1/n
A ideia é que o seguinte identidade prende sse as matrizes contêm os mesmos elementos:
A computação desses polinômios exatamente levará muito tempo. Em vez disso, escolhemos um primo aleatório p e um x 0 aleatório e testamos se
n ∏ i = 1 ( x 0 - a i ) ≡ n ∏
∏i=1n(x−ai)=∏i=1n(x−bi).
px0
Se as matrizes forem iguais, o teste sempre será aprovado, então vamos nos concentrar nos casos em que as matrizes são diferentes. Em particular, algum coeficiente de
∏ n i = 1 ( x - a i ) - ∏ n i = 1 ( x - b i ) é diferente de zero. Como
a i , b i tem magnitude
n O ( 1 ) , esse coeficiente tem magnitude
2 n n O (∏i=1n(x0−ai)≡∏i=1n(x0−bi)(modp).
∏ni=1(x−ai)−∏ni=1(x−bi)ai,binO(1) e, portanto, possui no máximo
O(n)fatores primos de tamanho
Ω(n). Isso significa que, se escolhermos um conjunto de pelo menos
n 2 primos
pde tamanho pelo menos
n 2 (digamos), então, para um primo aleatório
pdesse conjunto, ele manterá com probabilidade pelo menos
1-1 / nque
n ∏ i = 1 (x- a i )2nnO(n)=nO(n)O(n)Ω(n)n2pn2p1−1/n
Ummódulo
p aleatório
x 0 p testemunhará isso com probabilidade
1 - n / p ≥ 1 - 1 / n (uma vez que um polinômio de grau no máximo
n tem no máximo
n raízes).
∏i=1n(x−ai)−∏i=1n(x−bi)≢0(modp).
x0p1−n/p≥1−1/nnn
Em conclusão, se escolhermos um aleatório de tamanho aproximadamente n 2 entre um conjunto de pelo menos n 2 números primos diferentes e um módulo aleatório x 0 p , quando as matrizes não contiverem os mesmos elementos, nosso teste falhará com probabilidade 1 - O ( 1 / n ) . A execução do teste leva tempo O ( n ), pois p se encaixa em um número constante de palavras de máquina.pn2n2x0p1−O(1/n)O(n)p
Usando o teste de primalidade no tempo polinomial e como a densidade de primos de tamanho aproximadamente é Ω ( 1 / log n ) , podemos escolher um primo aleatório p no tempo ( log n ) O ( 1 ) . Escolhendo um aleatória x 0 modulo p pode ser implementado de várias maneiras, e é mais fácil uma vez que no nosso caso, não precisa de um completamente uniforme aleatória x 0 .n2Ω(1/logn)p(logn)O(1)x0px0
Em conclusão, nosso algoritmo é executado no tempo , sempre gera YES se as matrizes contiverem os mesmos elementos e gera NO com probabilidade 1 - O ( 1 / n ) se as matrizes não contiverem os mesmos elementos. Podemos melhorar a probabilidade de erro para 1 - O ( 1 / n C ) para qualquer C constante .O(n)1−O(1/n)1−O(1/nC)C