Trova il resto di un grande polinomio fisso quando diviso per un piccolo polinomio sconosciuto


9

Supponiamo di operare in un campo finito. Ci viene dato un grande polinomio fisso p (x) (di, diciamo, grado 1000) su questo campo. Questo polinomio è noto in anticipo e ci è permesso fare calcoli usando molte risorse nella "fase iniziale". Questi risultati possono essere memorizzati in tabelle di ricerca ragionevolmente piccole.

Alla fine della "fase iniziale", ci verrà dato un piccolo polinomio sconosciuto q (x) (di, diciamo, grado 5 o meno).

Esiste un modo rapido per calcolare p (x) mod q (x) dato che ci è permesso fare alcuni calcoli complicati nella "fase iniziale"? Un modo ovvio è calcolare p (x) mod q (x) per tutti i possibili valori di q (x). C'è un modo migliore per farlo?

Risposte:


3

I seguenti algoritmi funziona bene se il campo sottostante ha un ordine molto piccolo .s

Supponiamo di sapere che è irriducibile, di grado fisso d . Quindi, mod q , sappiamo che x s d = x regge. Quindi è sufficiente pre-calcolare p ( x )qdqxsd=x .p(x)modxsdx

In generale, può decomporsi in un prodotto di polinomi irriducibili q = q 1q r . In questo caso, un argomento simile si applica al calcolo di p modulo ogni q 1 , , q r separatamente, e quindi mettendo insieme i risultati. Quindi abbiamo davvero bisogno di calcolare p ( x )q(x)q=q1qrpq1,,qr per ogni d d .p(x)modxsdxdd


2

Penso che ci sia un modo abbastanza veloce per farlo. Lascia che i coefficienti del polinomio ancora sconosciuto siano b i , quindi q = d i = 0 b i x i dove d è un numero piccolo. Ora cominciamo a calcolare pqbiq=i=0dbixid dove p = D i = 0 a i x i , dove D è grande e a i sono noti. Ciò che facciamo riducendo il grado con uguaglianze come un D x D = - un Dp(modq)p=i=0DaixiDai. Alla fine ciò che otteniamo è un grado<d-1polinomiale, i cui coefficienti sono polinomi dellabi(poiché laaiè nota). Questi polinomi possiamo calcolare velocemente una volta che otteniamoq.aDxD=aDbdi=1d1bdixDi<d1biaiq


-1

Vedi commenti eccellenti su questo post qui sotto. :)


pre-elaborazione; input: p(x)

  1. Fattore come p ( x ) = 1000 i = 0 ( x i - r i ) .p(x)p(x)=i=01000(xiri)

  2. Conservare questo come una tabella di radici distinte r j e le loro rispettive molteplicità m j .Trjmj

Fase online; input: q(x)

  1. Fattore come q ( x ) = 5 i = 0 ( x i - r i ) .q(x)q(x)=i=05(xiri)

  2. Memorizzare questo come un elenco di radici distinte r j e le rispettive molteplicità m j .Lrjmj

  3. Mentre non è vuota, rimuovere la prossima radice / molteplicità da L e qualsiasi termini simili a T .LLT

  4. Leggere dalla tabella modificata e stampare.p(x)modq(x)T


Altri commenti:

  • Ovviamente vuoi ordinare la tabella e accedervi con la ricerca binaria (o un albero).T
  • (Sia il grado di .) Se vuoi che l'output sia nella rappresentazione dei coefficienti, puoi semplicemente fare un mucchio di FFT alla fine per ottenere tempo.p ( x ) p ( x ) mod q ( x ) ˜ O ( d )dp(x)p(x)modq(x)O~(d)
  • A seconda di come lo formalizzi, puoi probabilmente pre-calcolare molti dei vari modi in cui ricombinerai i termini in anticipo (stile di programmazione dinamica), in modo che la maggior parte (o tutte) delle moltiplicazioni siano solo ricerche. Il costo dominante è quindi il numero di ricerche, o approssimativamente . Se , questa è solo una manciata di operazioni aritmetiche concrete.O ( log d ) d = 1000TO(logd)d=1000

2
In quale campo stai prendendo in considerazione? Quanto ti aspetti che questa rappresentazione sia in termini di campo originale? E quando dici di leggere dalla tabella e dall'output modificati, cosa intendi?
David Eppstein,

2
Questo potrebbe funzionare solo se si opera su un campo dove entrambi e diviso. Ma questo sembra dipendere da ; in particolare, non è possibile pre-calcolare le radici per da solo. Inoltre, calcolare le radici di su un campo così ampio richiederà del tempo (almeno); questo non è meglio dell'algoritmo ingenuo. q q p q | p |pqqpq|p|
David Harris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.