Às vezes, ao escrever um programa, você precisa usar um número primo por algum motivo ou outro (por exemplo, criptografia). Suponho que, às vezes, você também precise usar um número composto. Às vezes, pelo menos aqui no PPCG, seu programa precisa ser capaz de lidar com alterações arbitrárias. E em circunstâncias convenientemente planejadas para fazer uma pergunta interessante sobre o PPCG, talvez até os números que você está usando tenham que ser resistentes à corrupção ...
Definições
Um número composto é um número inteiro ≥ 4 que não é primo, ou seja, é o produto de dois inteiros menores maiores que 1. Um número composto resistente a bitflip é definido da seguinte maneira: é um número inteiro positivo composto para o qual, se você o escrever em binário no número mínimo possível de bits, você pode alterar um ou dois bits do número e o número ainda é composto.
Exemplo
Por exemplo, considere o número 84. Em binário, é isso 1010100
. Aqui estão todos os números que diferem em não mais de 2 bits:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
A primeira coluna é o número em binário; a segunda coluna é o número em decimal. Como a terceira coluna indica, todos esses números são compostos. Como tal, 84 é um número composto resistente a bitflip.
A tarefa
Você deve escrever um dos três programas ou funções a seguir, o que fizer mais sentido para o seu idioma:
- Um programa ou função que recebe um número inteiro não negativo n como entrada e gera os primeiros n números compostos resistentes a bitflip.
- Um programa ou função que usa um número inteiro não negativo n como entrada e gera todos os números compostos resistentes a bitflip menores que n (ou se preferir, menores ou iguais a n , ou seja, você pode escolher se n está incluído na saída se bitflip -resistente).
- Um programa ou função que não recebe entrada e gera todos os números compostos resistentes a bitflip. (Isso deve usar um mecanismo de saída capaz de produzir saída enquanto o programa ainda está em execução, como imprimir em stdout, uma lista lenta ou um gerador; você não pode apenas calcular a lista inteira e imprimi-la.)
Casos de teste
Aqui estão os primeiros números compostos resistentes a bitflip:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Esclarecimentos
- São apenas os números que você produz que precisam ser resistentes aos bitflips. Esta não é uma tarefa para tornar o programa resistente a bitflips; use os números do programa que você gosta.
- Os números que você produz não precisam ser resistentes a um bitflip nos "zeros iniciais"; imagine que os números serão armazenados no número mínimo possível de bits e apenas esses bits deverão ser imunes a inversão. No entanto, os 1 bits iniciais nos números que você produz precisam estar imunes aos bitflips.
- Use qualquer algoritmo que desejar que produz o resultado certo; você não está sendo marcado em eficiência aqui.
- Se você puder provar que existem muitos números compostos resistentes a bitflip, a) as restrições no formato de saída são levantadas eb) a codificação codificada da lista será permitida (embora provavelmente seja mais detalhada do que apenas calculá-la). Esta regra é principalmente apenas para integridade; Não espero que seja relevante.
Condição de vitória
Isso é código-golfe , então, como de costume, quanto menor, melhor. Também como de costume, o comprimento do programa será medido em bytes.
n
sen
for resistente a bitflip? (ou seja, torná-lo "menor ou igual a n"?)Respostas:
Geléia , 20? 22 bytes
Experimente online!
Rende o primeiro n desses números.
Talvez o
;0
possa ser removido (sem ele, não verificamos se o número em si é composto - existem primos com todo o composto de troca de bits?)Note-se que é não suficiente para realizar o teste
not(any(is prime))
para o conjunto de números Fritou-bit. Também devemos testar0
se não está no conjunto.Isso ocorre porque
0
não é primo e não é composto (1
também é, mas veja abaixo).A necessidade de verificar
0
pode ser vista por um contra-exemplo:131136
( 2 17 +2 6 ) tem o seguinte conjunto de inversão de bits:Todos os quais, exceto
0
são compostos, ainda0
não são primos.1
também não é primo e não é composto e pode aparecer no conjunto. No entanto, podemos, se quisermos, deixar isso como se fosse um composto:todas as entradas menores ou iguais a
3
(se forem consideradas) contêm um de0
qualquer maneira (na verdade, todas são menos do7
que).para alcançar
1
um pouco, o número original deve ter a forma 2 k +2 0 e, se for maior que3
, ou seja, k> 1 , podemos alcançá-3
lo desligando o bit- k e configurando o 1 -bit ( 2 1 +2 0 = 3 ).para chegar
1
em dois pouco vira o número original deve ser da forma 2 k e se este é maior do que3
podemos alcançar2
em dois vira em vez disso, e2
é primo.Como está, o código está manipulando ambos
0
e1
juntos usando o átomo "insignificante"Ị
,.Quão?
fonte
;0
existe -Œċ
obtém todos os pares não ordenados com a substituição dos índices (J
), então, para 84, que tem 7 bits e 28 (incluindo os gostos de [1,1] para os lançamentos de bits únicos (do parte "com substituição"), e não 29 (mais nenhuma alteração).Braquilog ,
3238 bytesExperimente online!
Esta é uma função / predicado
↰₀
que retorna um gerador que gera todos esses números. (O link do TIO imprime apenas o primeiro número, para que algo seja observável. A execução localmente produziu muito mais.)Agora atualizado para lidar com números que estão dentro de dois bitflips de 0 ou 1 (que não são primos nem compostos) corretamente.
Explicação
Predicado auxiliar
↰₂
(retorna uma lista que é igual à entrada, exceto talvez um elemento)Eu adoraria se houvesse uma maneira mais tersa de fazer essa recursão relativamente simples, mas não tenho certeza se ainda existe; existem alguns recursos de aparência promissora na especificação, mas são marcados como não implementados.
Programa principal
↰₀
fonte
JavaScript (ES6), 96 bytes
Um programa completo que solicita o número de números inteiros correspondentes e os exibe um por um, usando
alert()
.A menos que seu navegador esteja configurado para usar a Otimização de chamada de cauda, isso acabará sendo interrompido devido a um estouro de recursão.
Abaixo está uma versão não recursiva (102 bytes).
Suposição
Esse algoritmo baseia-se na suposição de que todos os números compostos resistentes a bitflip são pares. Isso leva a uma simplificação bastante importante: em vez de inverter todos os pares de bits possíveis, apenas lançamos o bit # 0 e outro (ou nenhum outro bit) e verificamos se todos os números resultantes são compostos.
No entanto, não consigo encontrar nenhuma prova óbvia de que um número composto ímpar resistente a bitflip não exista realmente. Acontece que nunca é o caso de números pequenos (verifiquei até 1.000.000), e parece que a probabilidade de encontrar um está diminuindo à medida que o número de bits aumenta (mas essa é basicamente a minha intuição).
fonte
Geléia ,
2017 bytesExperimente online!
Como funciona
fonte
Python 2, 113 bytes
(A segunda linha é uma função sem nome que retorna uma lista de todos os números compostos resistentes a bitflip que são menores que a entrada para a função.)
A sintaxe
all(u%q for q in range(2,u))
será avaliada paraTrue
sempre queu
for primo ou menor que ou igual a2
e, caso contrário, será avaliada comoFalse
. (É vazioTrue
seu
for menor ou igual a2
.)Em outras palavras,
all(u%q for q in range(2,u))
é igual a0
se e somente seu
é composto.Se a entrada da função for menor que
2
, a função retornará uma lista vazia (conforme desejado). Portanto, assuma que a entradaN
é pelo menos2
e suponha1 <= n < N
. Para cada umk
de0
throughn
(inclusive), o código verificará se on
XOR'dk
é composto e também verifica sek
há no máximo dois1
na representação binária. Sen^k
for composto, ou sek
tiver mais de dois1
, passa para o próximo valor dek
. Se passar por todos os valores dek
from0
porn
esse caminho, será incluídon
na lista.Por outro lado, se houver um valor de
k
no máximo dois1
, quen^k
não seja composto,n
não será incluído na lista.fonte
Perl 6 ,
8785 bytesRetorna todos os números menores ou iguais ao número de entrada.
Como funciona
Para cada número n de 2 à entrada, faz o seguinte:
Gera todos os números inteiros não negativos que possuem o mesmo ou menor tamanho de bit que n .
Filtra os números desta lista com menos de três bits definidos (usando uma regex).
XOR é n com cada um desses números, produzindo todas as "mutações" válidas de n .
Somente deixa n fazer parte da lista de saída se nenhuma das mutações for não composta (verificada tomando cada mutação x módulo como uma junção total de números entre 2 e x -1).
fonte
Mathematica, 115 bytes
1byte economizado graças a @MartinEnderMuito ineficiente porque gera todos os números até 2 ^ ceil (lg (n)).
O segundo código usa U + F4A1 (
Function
função)fonte
Floróide ,
95109 bytesRetorna uma lista de números resistentes a bitflip até
input - 1
. Lida com as situações nervosas (0 e 1) também.Floroid é uma antiga linguagem minha, que eu usei apenas algumas vezes. Não o tocamos há muito tempo, daí o tamanho do programa.
Traduz para o seguinte código Python, que eu acho que poderia ser reduzido com recursão.
Cada função usada aqui é predefinida no Floroid. Esta página contém todas as funções e suas definições.
fonte
MATL ,
30282726 bytesExperimente online!
Produz todos os números compostos resistentes a bitflip até (e inclusive) n. Usa idéias de ambas as soluções Jelly - considera apenas 0 como um problema não prioritário; e gera uma lista de números dentro de uma distância 2 primeiro e depois faz um xor.
Solução alternativa, fazendo um loop (30 bytes):
Produz todos os números compostos resistentes a bitflip até (e inclusive) n.
fonte
CJam ,
3433 bytesCalcula todos os compostos resistentes a bitflip estritamente menores que n .
Como Jonathan Allan, não tenho certeza se é realmente necessário verificar 0 bitflips. Se acontecer que nenhum número primo tem todos os seus bitflips resultam em números compostos, o
0+
pode ser removido.Experimente online!
Explicação
fonte
MATL , 29 bytes
Obrigado a Jonathan Allan pela correção.
Isso leva um número n e gera todos os números compostos resistentes a bitflip até n .
Como funciona
Experimente no MATL Online!
fonte