Como posso encontrar o número mínimo necessário para adicionar à sequência, de modo que seu xor se torne zero


8

Dada uma sequência de números naturais, você pode adicionar qualquer número natural a qualquer número na sequência, de modo que seu xor se torne zero. Meu objetivo é minimizar a soma dos números adicionados.

Considere os seguintes exemplos:

  1. Para a resposta é ; adicionando a , obtemos .1,322133=0

  2. Para a resposta é ; somando a e a , obtemos .10,4,5,163103513481=0

  3. Para a resposta é , pois .4,4044=0

Tentei trabalhar em representações binárias do número de sequência, mas ficou muito complexo. Quero saber se existe alguma maneira simples e eficiente de resolver esse problema.


2
Uma declaração mais clara do mesmo problema de um pôster diferente em math.SE pode ser encontrada aqui , juntamente com outra resposta.
precisa saber é o seguinte

Problema interessante. Parece um problema de soma de subconjunto em que o operador de soma é substituído por XOR e, de tal forma que (se o subconjunto não for XOR para 0), o conjunto será XORed com outro conjunto ...(s1,s2,,sn){0,1}n(k,k,,k)
user13675

Respostas:


5

Parece-me que contém todas as informações necessárias: os bits em são os bits que você precisa inserir (exatamente) um dos . Como você só pode adicionar , você precisa encontrar um onde o bit correspondente é e invertê-lo - isso causa o mesmo custo para todos os , ou seja, , portanto a escolha não importa. O problema começa se não houver tal .a=aian1aaiaij0ai2jai

É por isso que você precisa fazer isso iterativamente e trabalhar a partir do menos significativo. Proceda como acima; se não houver um adequado , escolha o com o número máximo de bits restante da posição atual - isso aumenta a chance de encontrar um candidato adequado em futuras iterações -, vire o bit e continue, isso é inverter tudo uns para a esquerda até você virar um zero para um. Observe que ainda adicionamos ). Como carry se propaga apenas para a esquerda, as escolhas anteriores não são invalidadas. Recompute e continue com ; itere até que você tenha .aiai12jaj+1a=0

Note-se que esta é apenas uma heurística, tanto quanto eu posso dizer: a escolha do pode ser subótimo se faz com que muitos bits em tornar-se não-zero. Não tenho certeza se isso pode ser evitado.ia


0

Na verdade, não tenho uma solução, mas aqui estão algumas idéias que surgiram.

Se você observar os resultados do XOR de todos os números na sequência, isso fornecerá um limite superior para o número de adições que você precisa fazer. Por exemplo, no seu exemplo de , temos , portanto, você sabe que não precisa adicionar mais de (porque o 8-bit é o conjunto mais alto). Distribuir até oito "unidades" distribuídas de quatro maneiras é um conjunto bastante pequeno de combinações. Não me lembro dessa fórmula tão tarde da noite, mas há umlá em algum lugar.10,4,5,110451=108n!

Para fundamentar um pouco mais essa afirmação, considere números inteiros arbitrários modo que . Os bits acima do bit 3 obviamente cancelam, para que você possa ignorá-los. Para os quatro bits mais baixos, eles são XOR a 8, então o pior caso possível (em termos de número de unidades que você precisa adicionar) é se e (todos os zeros, exceto o bit mais alto), porque você é necessário adicionar +8 a B para definir o bit superior. Se houver qualquer um bits definidos em qualquer um dos números, você precisa adicionar menos.A,BAB=8A=8B=0

Talvez você possa começar com isso e desenvolver uma quantidade máxima mais apertada para adicionar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.