Find a number which give minimum sum when XOR with every number of array of integer in Python

Given an array of integers, we need to find a number X such that the sum of XOR operations between X and each array element is minimized. The key insight is to analyze each bit position independently and choose the bit value that minimizes the total XOR sum.

Algorithm Approach

For each bit position, we count how many numbers have that bit set. If more than half the numbers have a bit set at position i, then setting that bit in X will minimize the XOR sum for that position.

Step-by-Step Solution

Here's how the algorithm works ?

from math import log2

def find_minimum_xor_sum(arr):
    n = len(arr)
    
    # Find maximum element to determine number of bits needed
    max_element = max(arr)
    
    # Calculate number of bits required
    num_bits = int(log2(max_element)) + 1 if max_element > 0 else 1
    
    X = 0
    
    # Check each bit position
    for bit_pos in range(num_bits):
        count_set_bits = 0
        
        # Count how many numbers have this bit set
        for num in arr:
            if num & (1 << bit_pos):
                count_set_bits += 1
        
        # If more than half have this bit set, set it in X
        if count_set_bits > n // 2:
            X += 1 << bit_pos
    
    # Calculate the minimum sum
    total_sum = sum(X ^ num for num in arr)
    
    return X, total_sum

# Test with example array
arr = [3, 4, 5, 6, 7]
X, min_sum = find_minimum_xor_sum(arr)
print(f"X = {X}, Sum = {min_sum}")
X = 7, Sum = 10

How It Works

Let's trace through the example with array [3, 4, 5, 6, 7] ?

def trace_algorithm(arr):
    print(f"Array: {arr}")
    print("Binary representation:")
    for i, num in enumerate(arr):
        print(f"arr[{i}] = {num:2d} = {num:04b}")
    
    n = len(arr)
    max_element = max(arr)
    num_bits = int(log2(max_element)) + 1
    
    print(f"\nMax element: {max_element}, Bits needed: {num_bits}")
    
    X = 0
    print(f"\nBit analysis:")
    
    for bit_pos in range(num_bits):
        count_set_bits = 0
        bit_values = []
        
        for num in arr:
            bit_set = bool(num & (1 << bit_pos))
            bit_values.append(1 if bit_set else 0)
            if bit_set:
                count_set_bits += 1
        
        set_bit_in_x = count_set_bits > n // 2
        if set_bit_in_x:
            X += 1 << bit_pos
            
        print(f"Bit {bit_pos}: {bit_values} | Count: {count_set_bits}/{n} | Set in X: {set_bit_in_x}")
    
    print(f"\nOptimal X = {X} = {X:04b}")
    
    # Calculate XOR sums
    total_sum = 0
    print(f"\nXOR calculations:")
    for i, num in enumerate(arr):
        xor_result = X ^ num
        total_sum += xor_result
        print(f"{X} ^ {num} = {xor_result}")
    
    print(f"\nMinimum sum = {total_sum}")

trace_algorithm([3, 4, 5, 6, 7])
Array: [3, 4, 5, 6, 7]
Binary representation:
arr[0] =  3 = 0011
arr[1] =  4 = 0100
arr[2] =  5 = 0101
arr[3] =  6 = 0110
arr[4] =  7 = 0111

Max element: 7, Bits needed: 3

Bit analysis:
Bit 0: [1, 0, 1, 0, 1] | Count: 3/5 | Set in X: True
Bit 1: [1, 0, 0, 1, 1] | Count: 3/5 | Set in X: True
Bit 2: [0, 1, 1, 1, 1] | Count: 4/5 | Set in X: True

Optimal X = 7 = 0111

XOR calculations:
7 ^ 3 = 4
7 ^ 4 = 3
7 ^ 5 = 2
7 ^ 6 = 1
7 ^ 7 = 0

Minimum sum = 10

Testing with Different Arrays

# Test with different arrays
test_cases = [
    [1, 2, 3],
    [10, 20, 30, 40],
    [8, 9, 10, 11, 12],
    [1, 1, 1, 1]
]

for arr in test_cases:
    X, min_sum = find_minimum_xor_sum(arr)
    print(f"Array: {arr}")
    print(f"Optimal X: {X}, Minimum sum: {min_sum}")
    print()
Array: [1, 2, 3]
Optimal X: 3, Minimum sum: 2

Array: [10, 20, 30, 40]
Optimal X: 46, Minimum sum: 60

Array: [8, 9, 10, 11, 12]
Optimal X: 15, Minimum sum: 10

Array: [1, 1, 1, 1]
Optimal X: 1, Minimum sum: 0

Time and Space Complexity

  • Time Complexity: O(n × log(max_element)) where n is array length
  • Space Complexity: O(1) excluding input array

Conclusion

The algorithm finds the optimal X by analyzing each bit position independently and choosing bits that minimize the XOR sum. For each bit position, if more than half the numbers have that bit set, setting it in X reduces the overall sum.

Updated on: 2026-03-25T10:09:03+05:30

188 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements