Primi XOR negativi


9

Circa un anno fa ti è stato chiesto di trovare i numeri primi di XOR . Questi sono numeri i cui unici fattori sono 1 e se stessi quando si esegue la moltiplicazione XOR nella base 2 . Ora avrebbero speziato un po 'le cose.

Troveremo i numeri primi XOR nella base -2

Conversione in base -2

La base -2 è molto simile a tutte le altre basi. Il posto più a sinistra è il posto 1s (1 = (-2) 0 ), accanto a quello è il posto -2s (-2 = (-2) 1 ), accanto a quello è il posto 4s (4 = (-2) ) 2 ), e così via e così via. La grande differenza è che i numeri negativi possono essere rappresentati nella base -2 senza alcun segno negativo.

Ecco alcuni esempi di conversioni:

Decimal | Base -2
-----------------
 6      |   11010
-7      |    1001
 12     |   11100
-15     |  110001

Aggiunta di XOR in Base -2

L'aggiunta di XOR in Base -2 è praticamente la stessa dell'aggiunta di XOR in binario. È sufficiente convertire il numero in Base -2 e XOR ogni cifra in atto. (È uguale all'aggiunta senza carry)

Ecco un esempio elaborato passo passo:

(Useremo il simbolo +'per indicare l'aggiunta di Base -2 XOR)

Inizia dalla base 10:

6 +' -19

Converti in base -2:

11010 +' 10111

Aggiungili senza trasportare:

   11010
+' 10111
---------
   01101

Converti i risultati in base 10:

-3

Moltiplicazione XOR in Base -2

Ancora una volta la moltiplicazione XOR in base -2 è quasi uguale alla moltiplicazione XOR in binario. Se non si ha familiarità con XOR moltiplicazione in base 2 c'è una spiegazione eccellente qui vi consiglio di dare un'occhiata a quella prima.

La moltiplicazione XOR in Base -2 equivale a eseguire una moltiplicazione lunga in base -2 tranne quando si tratta dell'ultimo passaggio invece di sommare tutti i numeri con un tradizionale che +si utilizza +'sopra definito.

Ecco un esempio elaborato di seguito:

Inizia in decimale:

8 *' 7

Converti in base -2:

11000 *' 11011

Imposta divisione lunga:

   11000
*' 11011
---------

Moltiplica il primo numero per ogni posizione nel secondo

      11000
*'    11011
------------
      11000
     11000
        0
   11000
  11000

Aggiungi tutti i risultati usando l'aggiunta XOR di base -2

       11000
*'     11011
-------------
       11000
      11000
         0
    11000
+' 11000
-------------
   101101000

Convertire il risultato in decimale:

280

La sfida

La tua sfida è verificare se un numero è o meno un numero primo XOR in base -2. Un numero è un numero primo XOR in base -2 se l'unica coppia di numeri interi che si moltiplica in esso in base è 1 e se stessa. (1 non è un numero primo)

Riceverai un numero e produrrai un valore booleano, in verità se l'input è un numero primo XOR in base -2 in caso contrario.

Le soluzioni verranno classificate in byte con l'obiettivo di raggiungere il numero più basso di byte.

Casi test

Di seguito sono riportati tutti i numeri primi XOR nella base -2:

-395
-3
-2
 3
 15
 83

I seguenti non sono numeri primi XOR in base -2:

-500
-4
 0
 1
 258
 280

258sembra uguale-2 *' -129 = 10 *' 10000011
JungHwan Min

@JungHwanMin mio male che uno doveva essere nell'altra categoria. Mi scuso se questo ti ha causato problemi.
Ad Hoc Garf Hunter

Risposte:


3

Mathematica, 156 101 byte

IrreduciblePolynomialQ[FromDigits[{#}//.{a_,p___}/;a!=1&&a!=0:>{-⌊a/2⌋,a~Mod~2,p},x],Modulus->2]&

Come indicato qui , questo funziona perché la moltiplicazione XOR è essenzialmente la moltiplicazione nell'anello polinomiale F_2.

Spiegazione

{#}//.{a_,p___}/;a!=1&&a!=0:>{-⌊a/2⌋,a~Mod~2,p}

Inizia con {input}. Sostituisci ripetutamente un numero a(tranne 0 e 1) con amod 2 e anteponi -floor ( a/ 2), fino a quando non cambia. Questo calcola l'input in base -2.

FromDigits[ ... ,x]

Crea un polinomio usando le cifre del numero -2 di base, usando xcome variabile. es. {1, 1, 0}->x^2 + x

IrreduciblePolynomialQ[ ... ,Modulus->2]

Controllare se il polinomio risultante è irriducibile, con il modulo 2.

Vecchia versione (156 byte)

If[#==1,1,Outer[FromDigits[BitXor@@(#~ArrayPad~{i++,--l}&)/@Outer[i=0;l=m;1##&,##],-2]&,k=Tuples[{0,1},m=Floor@Log2[8Abs@#~Max~1]]~Drop~{2},k,1,1]]~FreeQ~#&

Elenco dei numeri primi

Ecco un elenco di numeri primi XOR di base -2 compresi tra -1000 e 1000 (pastebin)

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.