Primários XOR negativos

9

Há cerca de um ano, você foi solicitado a encontrar os primos XOR . Esses são números cujos únicos fatores são 1 e eles mesmos ao executar a multiplicação de XOR na base 2 . Agora vamos apimentar um pouco as coisas.

Vamos encontrar os primos XOR na base -2

Convertendo para Base -2

A base -2 é muito parecida com qualquer outra base. O lugar mais à esquerda é o lugar dos 1s (1 = (-2) 0 ), próximo ao local dos -2s (-2 = (-2) 1 ), próximo ao local dos 4s (4 = (-2 ) 2 ) e assim por diante. A grande diferença é que números negativos podem ser representados na base -2 sem nenhum sinal negativo.

Aqui estão alguns exemplos de conversões:

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

Adição de XOR na Base -2

A adição de XOR na Base -2 é praticamente igual à adição de XOR em binário. Você simplesmente converte o número em Base -2 e XOR cada dígito no lugar. (É o mesmo que adição sem o transporte)

Aqui está um exemplo trabalhado passo a passo:

(Usaremos o símbolo +'para indicar a adição XOR da Base -2)

Comece na base 10:

6 +' -19

Converta na base -2:

11010 +' 10111

Adicione-os sem carregar:

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

Converta seu resultado novamente na base 10:

-3

Multiplicação XOR na Base -2

Mais uma vez, a multiplicação de XOR na base -2 é quase a mesma que a multiplicação de XOR em binário. Se você não está familiarizado com a multiplicação de XOR na base 2, há uma excelente explicação aqui . Sugiro que você dê uma olhada nisso primeiro.

A multiplicação XOR na Base -2 é o mesmo que realizar a multiplicação longa na base -2, exceto quando se trata da última etapa, em vez de somar todos os números com um tradicional que +você usa +'como definido acima.

Aqui está um exemplo elaborado abaixo:

Iniciar em decimal:

8 *' 7

Converter em Base -2:

11000 *' 11011

Configurar divisão longa:

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

Multiplique o primeiro número por todos os lugares no segundo

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

Adicione todos os resultados usando a adição -2 XOR de base

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

Converta o resultado novamente em decimal:

280

O desafio

Seu desafio é verificar se um número é ou não um XOR prime na base -2. Um número é um primo XOR na base -2 se o único par de números inteiros que se multiplicar na base for 1 e ele próprio. (1 não é primo)

Você receberá um número e emitirá um valor booleano, na verdade, se a entrada for um XOR prime na base -2, caso contrário, será falso.

As soluções serão pontuadas em bytes com o objetivo de atingir o menor número de bytes.

Casos de teste

A seguir estão todos os números primos XOR na base -2:

-395
-3
-2
 3
 15
 83

Os seguintes não são primos XOR na base -2:

-500
-4
 0
 1
 258
 280
Caçador Ad Hoc Garf
fonte
258parece igual-2 *' -129 = 10 *' 10000011
JungHwan Min 14/01
@JungHwanMin meu mal que um deveria estar na outra categoria. Peço desculpas se isso lhe causou algum problema.
Ad Hoc Garf Hunter

Respostas:

3

Mathematica, 156 101 bytes

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

Como afirmado aqui , isso funciona porque a multiplicação de XOR é essencialmente multiplicação no anel polinomial F_2.

Explicação

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

Comece com {input}. Substitua repetidamente um número a(exceto 0 e 1) pelo amod 2 e prepend -floor ( a/ 2), até que ele não seja alterado. Isso calcula a entrada na base -2.

FromDigits[ ... ,x]

Crie um polinômio usando os dígitos do número base -2, usando xcomo variável. por exemplo {1, 1, 0}->x^2 + x

IrreduciblePolynomialQ[ ... ,Modulus->2]

Verifique se o polinômio resultante é irredutível, com o módulo 2.

Versão antiga (156 bytes)

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~#&

Lista de números primos

Aqui está uma lista de primos XOR base -2 entre -1000 e 1000 (pastebin)

JungHwan Min
fonte