Fattorizza un polinomio su un campo finito o sugli interi


20

Senza utilizzare alcuna funzione di factoring / polinomio incorporata, fattore un polinomio completamente in irriducibili sopra gli interi o un campo finito.

Ingresso

Il tuo programma / funzione riceverà un numero primo (o zero) ncome input. Il campo / anello è il campo finito di quell'ordine (cioè Z/nZ), o semplicemente Zse lo nè 0. Il tuo programma potrebbe fallire se nnon lo è 0o è un numero primo. Il polinomio sarà presente F[x].

Il tuo programma / funzione riceverà anche il polinomio come input.

C'è una certa flessibilità nell'input, assicurati di specificare come intendi ricevere l'input. Ad esempio, il polinomio potrebbe essere inserito come un elenco di coefficienti o nella forma che la maggior parte delle persone si aspetta (es:) 50x^3 + x^2o in qualche altra forma ragionevole. Oppure il formato di inserimento del campo / anello potrebbe anche essere diverso.

Produzione

Il tuo programma / funzione produrrà il polinomio fattorizzato completamente. È possibile lasciare più radici espanse (ovvero (x + 1)(x + 1)anziché (x + 1)^2). È possibile rimuovere spazi bianchi tra operatori binari. È possibile sostituire la giustapposizione con *. È possibile inserire spazi bianchi in posti strani. È possibile riordinare i fattori nell'ordine desiderato. Il xtermine potrebbe essere (x). xpuò essere scritto come x^1; tuttavia il termine costante potrebbe non avere x^0. +Sono ammessi segni estranei . Potresti non avere un termine con un 0davanti, devono essere esclusi. Il termine principale di ciascun fattore deve essere positivo, i segni negativi devono essere al di fuori.

Casi di test, il tuo programma dovrebbe essere in grado di produrre output per ciascuno di questi in tempi ragionevoli (diciamo <= 2 ore):

Ingresso: 2, x^3 + x^2 + x + 1

Produzione: (x + 1)^3

Ingresso: 0, x^3 + x^2 + x + 1

Produzione: (x + 1)(x^2 + 1)

Ingresso: 0, 6x^4 – 11x^3 + 8x^2 – 33x – 30

Produzione: (3x + 2)(2x - 5)(x^2 + 3)

Ingresso: 5, x^4 + 4x^3 + 4x^2 + x

Produzione: x(x + 4)(x + 4)(x + 1)

Ingresso: 0, x^5 + 5x^3 + x^2 + 4x + 1

Produzione: (x^3 + 4x + 1)(x^2 + 1)

Un ringraziamento speciale a Peter Taylor per aver criticato i miei casi di test


1
Penso che questo mi stia dando un flashback ad alcuni dei più difficili studi universitari di matematica . Sto anche andando nella giusta direzione qui?
Trauma digitale

1
Questo mi ricorda il tempo in cui ho avuto incubi cercando di stampare correttamente i polinomi ...
Sp3000,

Mi dispiace di non aver capito, ma che cosa dovrebbe fare il primo numero di input? o in che modo influisce sull'output?
Ottimizzatore

@Optimizer Il primo numero di input determina il campo / i numeri interi su cui si sta lavorando. Se il numero è diverso da zero, stai lavorando sul campo finito di quell'ordine. Un campo di ordine finito pha gli elementi {0, 1, ... , p-1}ed è in mod aggiunta / moltiplicazione p. Fondamentalmente, riduci qualsiasi coefficiente di mod pe sei a posto. Inoltre, nota che se ha una radice, cioè un fattore lineare, uno di {0, ... , p-1}produrrà 0(mod p) quando è collegato al polinomio.
Giustino,

1
@flawr, l'approccio standard al factoring over Zè di fattorizzare Z/pZun pascensore adatto e quindi Hensel. Tuttavia, l'approccio golfistico è probabilmente (e questo è certamente il percorso che sto guardando) per usare un semplice limite sull'altezza dei fattori e forzarlo bruto.
Peter Taylor,

Risposte:


17

GolfScript (222 byte)

~.@:q@.0\{abs+}/2@,2/)?*or:^{\1$^base{^q- 2/-}%.0=1=1$0=q>+{{:D[1$.,2$,-)0:e;{.0=0D=%e|:e;(D(@\/:x@@[{x*~)}%\]zip{{+}*q!!{q%}*}%}*e+])0-{;0}{@;@\D.}if}do}*;\).^3$,)2/?<}do;][[1]]-{'('\.,:x;{.`'+'\+'x^'x(:x+x!!*+\!!*}%')'}/

Demo online

Appunti

  1. Il formato di input è nseguito da un array GolfScript di coefficienti dal più al meno significativo. Ad esempio, 0, x^5 + 5x^3 + x^2 + 4x + 1deve essere formattato come 0 [1 0 5 1 4 1].
  2. Su un campo finito, ci sono solo molti polinomi di grado sufficientemente piccolo da essere rilevanti. Tuttavia, non è così Z. Gestisco Zusando una forma rilassata del limite di altezza di Mignotte. Un ottimo documento sui limiti di altezza nel factoring è Bounds on Factors in Z [x] , John Abbott, 2009 (il link è alla prestampa arxiv; il suo CV afferma che è stato accettato dal Journal of Symbolic Computation ). La forma più rilassata data lì è in termini di norma L-2, ma per risparmiare byte mi rilasso ulteriormente e invece uso la norma L-1. Quindi è un caso di forzatura bruta per divisione di prova.
  3. Su un campo finito, ogni polinomio è un tempo costante un polinomio monico, quindi eseguo solo una divisione di prova per polinomi monici e salvo un reciproco nel campo. Tuttavia, Zè solo un anello ed è quindi necessario effettuare una divisione di prova per fattori candidati non monici. Riesco a cavarmela senza implementare numeri razionali facendo un test di divisione dei fattori e accumulando un flag di "errore" e.
  4. Entrambi i punti 2 e 3 implicano che il caso del factoring Zè generalmente più lento e non può essere testato con la demo online. Tuttavia, il più lento dei casi di test ufficiali richiede 10 minuti, il che è ben entro il termine "ragionevole".
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.