Come posso trovare il numero minimo richiesto per aggiungere alla sequenza in modo tale che il loro xor diventi zero


8

Data una sequenza di numeri naturali, è possibile aggiungere qualsiasi numero naturale a qualsiasi numero nella sequenza in modo tale che il loro xor diventi zero. Il mio obiettivo è ridurre al minimo la somma dei numeri aggiunti.

Considera i seguenti esempi:

  1. Per la risposta è ; aggiungendo a otteniamo .1,322133=0

  2. Per la risposta è ; aggiungendo da a e da a otteniamo .10,4,5,163103513481=0

  3. Per la risposta è , poiché .4,4044=0

Ho provato a lavorare su rappresentazioni binarie del numero progressivo ma è diventato così complesso. Voglio sapere se esiste un modo semplice ed efficace per risolvere questo problema.


2
Una dichiarazione più chiara dello stesso problema da un poster diverso su math.SE può essere trovata qui , insieme a un'altra risposta.
Dilip Sarwate,

Problema interessante. Sembra un problema di somma dei sottoinsiemi in cui l'operatore di somma viene sostituito con XOR e tale che (se il sottoinsieme non fa XOR su 0) l'insieme è esso stesso XORed con un altro insieme ...(s1,s2,,sn){0,1}n(k,k,,k)
user13675

Risposte:


5

Mi sembra che contenga tutte le informazioni necessarie: i bit in sono i bit necessari per inserire (esattamente) uno dei . Poiché ti è consentito solo aggiungere , devi trovare uno dove il bit corrispondente è e capovolgerlo - questo provoca lo stesso costo per tutti , cioè , quindi la scelta non ha importanza. I problemi iniziano se non esiste tale .a=aian1aaiaij0ai2jai

Questo è il motivo per cui devi farlo iterativamente e lavorare dal minimo significativo verso l'alto. Procedere come sopra; se non vi è adatto , scegliere con il numero massimo di bit rimasto della posizione corrente - ciò aumenta la possibilità di trovare un candidato adatto in iterazioni future -, capovolgere il bit e riporto, ovvero capovolgere tutto quelli a sinistra fino a quando non capovolgi uno zero su uno. Nota che aggiungiamo ancora ). Poiché il carry si propaga solo a sinistra, le scelte precedenti non vengono invalidate. Ricalcola e continua con ; iterare fino a quando non si ha .aiai12jaj+1a=0

Si noti che questo è solo un euristico per quanto posso dire: la scelta può essere ottimale se causa molti bit in a diventare non-zero. Non sono sicuro che questo possa essere evitato.ia


0

In realtà non ho una soluzione, ma ecco alcune idee che sono venute fuori.

Se guardi i risultati di XORing di tutti i numeri nella sequenza, questo dà un limite superiore al numero di aggiunte che devi fare. Ad esempio, nel tuo esempio di , abbiamo , quindi sai che non devi aggiungere più di (perché l'8-bit è il più alto set). Distribuire fino a otto "uno" distribuito in quattro modi, è un insieme abbastanza piccolo di combinazioni. Non riesco a ricordare quella formula a tarda notte, ma c'è unalì da qualche parte.10,4,5,110451=108n!

Per dare a questa affermazione un po 'più di messa a terra, considera interi arbitrari tali che . I bit più alti del bit 3 ovviamente si annullano tutti, quindi puoi ignorarli. Per i quattro bit inferiori, vanno da XOR a 8, quindi il caso peggiore possibile (in termini di numero di quelli che è necessario aggiungere) è se e (tutti gli zero tranne il bit più alto) perché è necessario aggiungere +8 a B per ottenere quel bit superiore impostato. Se ci sono eventuali uno bit impostati in uno dei numeri, è necessario aggiungere meno.A,BAB=8A=8B=0

Forse puoi iniziare da questo e sviluppare una quantità massima più stretta da aggiungere.

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.