Trova un numero che genera tutti i numeri interi mod q


9

Considera gli interi in qcui qè primo, un generatore è qualsiasi intero in 1 < x < qmodo che x^1, x^2, ..., x^(q-1)copra tutti q-1gli interi tra 1e q-1. Ad esempio, consideriamo gli interi modulo 7 (che scriviamo come Z_7). Quindi 3, 3^2 mod 7 = 2, 3^3 = 27 mod 7 = 6, 3^4 = 81 mod 7 = 4, 3^5 = 243 mod 7 = 5, 3^6 = 729 mod 7 = 1copre tutti i valori 3, 2, 6, 4, 5, 1copre tutti gli interi 1..6come richiesto.

Il compito è scrivere il codice che accetta un input ne genera un generatore per Z_n. Ovviamente non puoi usare alcun builtin o libreria che lo faccia per te.

L'unica limitazione all'esecuzione del tuo codice è che devi averlo testato per completarlo n = 4257452468389.

Nota che 2^n significa 2potere di n. Ciò ^rappresenta esponenziazione.


Hmm ... 1 < x < qrende la sfida molto più semplice.
Erik the Outgolfer,

@EriktheOutgolfer Non sono sicuro di sapere cosa intendi? Questi sono solo tutti gli interi distinti che non sono 0 o 1.

Voglio dire, è più facile di quello che molti probabilmente pensano ... o forse un momento inattivo su PPCG.
Erik the Outgolfer,

3
Ma penso che richiedere alle persone di testarlo fino al completamento su un gran numero non sia necessario ... fondamentalmente tio sarebbe solo un errore di memoria.
Erik the Outgolfer,

@Lembik Esiste un caso in cui non esiste un generatore per un determinato numero? Alcuni casi di test sarebbero buoni.
Mr. Xcoder,

Risposte:


13

Pyth, 16 15 byte

f-1m.^T/tQdQPtQ

Suite di test

Se p è l'input, sappiamo che g ^ (p-1) = 1 mod p, quindi dobbiamo solo controllare che g ^ a! = 1 mod p per eventuali a più piccoli a. Ma a deve essere un fattore di p-1 perché ciò sia possibile, e qualsiasi multiplo di a con quella proprietà avrà anche quella proprietà, quindi dobbiamo solo controllare che g ^ ((p-1) / q)! = 1 mod p per tutti i fattori primi q di p-1. Quindi, controlliamo tutti gli interi g in ordine crescente finché non ne troviamo uno che funzioni.

Spiegazione:

f-1m.^T/tQdQPtQ
f                  Return the first value T such that the following is truthy:
            PtQ    Take the prime factorization of the input - 1.
   m               Map those prime factors to
       /tQd        Take the input - 1 divided by the factor
    .^T    Q       Raise T to that exponent mod input,
                   performed as modular exponentiation, for performance.
 -1                Check that 1 is not found among the results.

Abbastanza impressionante!

Il tuo codice esegue la fattorizzazione?

@Lembik Lo fa (la PtQparte).
Erik the Outgolfer,


-3
%MATLAB CODE
%Program to generate Z_n for an integer n
n = input('Enter a number to find modulo')
q = input ('Enter a prime number greater than the number you wished to find modulo')
if n>=q 
   fprintf('Error')
   exit(1)
end
for R=1:q-1
    fprintf(rem(n.^R, q))
    fprintf('\n')
end

1
Questo non sta risolvendo il problema giusto. Il tuo codice dovrebbe, ad esempio, accettare un input e fornire un output.

1
Inoltre, questo codice non è affatto giocato a golf. Il codice golfizzato deve essere il più breve possibile, quindi è possibile rimuovere il testo di input e gli spazi attorno ai segni di uguale e simili.
Compagno SparklePony,

3
@ComradeSparklePony Penso che il primo problema che non sta risolvendo il problema giusto dovrebbe essere affrontato per primo :)
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.