0CTF 2019 Final - Quantum Measure (Crypto, 428)

Challenge

The unzip password is sha256 of flag in Quantum game.

File : Quantum Measure.zip (without password)


This challenge has two programs sharing 8 qubits (as q0 ~ q7).

The flag is 4 bytes long (8 hex), each hex can be expressed as the probability of qubit’s outcome.

e.g. the flag is “01234567” :
  • q0=0161+16160q_0 = \frac{0}{16}|1\rangle + \frac{16}{16}|0\rangle

  • q1=1161+15160q_1 = \frac{1}{16}|1\rangle + \frac{15}{16}|0\rangle

  • q2=2161+14160q_2 = \frac{2}{16}|1\rangle + \frac{14}{16}|0\rangle

  • q3=3161+13160q_3 = \frac{3}{16}|1\rangle + \frac{13}{16}|0\rangle

  • q4=4161+12160q_4 = \frac{4}{16}|1\rangle + \frac{12}{16}|0\rangle

  • q5=5161+11160q_5 = \frac{5}{16}|1\rangle + \frac{11}{16}|0\rangle

  • q6=6161+10160q_6 = \frac{6}{16}|1\rangle + \frac{10}{16}|0\rangle

  • q7=7161+9160q_7 = \frac{7}{16}|1\rangle + \frac{9}{16}|0\rangle

program1 :
  • measure q4 ~ q7 as input.
  • Some gates (Swap,Cnot,X gate) will act on q0 ~ q3 (depends on result of q4 ~ q7 measurement).
  • the output will be the first four bits in result.
program2 :
  • measure q0 ~ q3 as input.
  • Some gates (Swap,Cnot,X gate) will act on q4 ~ q7 (depends on result of q0 ~ q3 measurement).
  • the output will be the last four bits in result.

Solution

1. Consider the qubits (q4~q7), there are only 16 conditions. Parse the program to 16 subprograms.

Origin Program (here is program1) :

I 4
MEASURE 4 reg[4]
@IF reg[4]
SWAP 0 2
@ELSE
CNOT 3 1

I 5
MEASURE 5 reg[5]
@IF3 reg[5]
CNOT 0 2
@ELSE3
SWAP 3 0
X 0

...

convert into :

if |0000> :
CNOT 3 1
SWAP 3 0
X 0
SWAP 2 1
SWAP 0 1
X 0
if |0001> :
...
if |0010> :
...
...
if |1111> :
...

2. Consider the qubits (q0~q3), there are also only 16 conditions.

Match those inputs and corresponding outputs

|0000> -> |1000>
|0001> -> |1001>
|0010> -> |0100>
|0011> -> |0101>
|0100> -> |1010>
|0101> -> |1011>
...

3. Convert to formula.

Assume the probabilty of q0 ~ q7 outcome 11 is, a,b,c,d,e,f,g,h

If the measurment of q4 ~ q7 is 0000|0000\rangle (this probability is (1e)(1f)(1g)(1h)(1-e)(1-f)(1-g)(1-h) ),

and the probability of first four bits in result become 1000|1000\rangle will equal to the probability of q0 ~ q3 getting 0000|0000\rangle (Here, the probability is (1a)(1b)(1c)(1d)(1-a)(1-b)(1-c)(1-d)),

\Rightarrow The probability of output 1000|1000\rangle will be (1e)(1f)(1g)(1h)(1a)(1b)(1c)(1d)(1-e)(1-f)(1-g)(1-h) * (1-a)(1-b)(1-c)(1-d)

Consider all possible in q4 ~ q7

The probability of output p0:0000p0 : |0000\rangle will be the sum of below :

  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 0000|0000\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 0001|0001\rangle
  • The probability of q0~q3 = 0000|0000\rangle with q4 ~ q7 = 0010|0010\rangle
  • The probability of q0~q3 = 0000|0000\rangle with q4 ~ q7 = 0011|0011\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 0100|0100\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 0101|0101\rangle
  • The probability of q0~q3 = 0000|0000\rangle with q4 ~ q7 = 0110|0110\rangle
  • The probability of q0~q3 = 0000|0000\rangle with q4 ~ q7 = 0111|0111\rangle
  • The probability of q0~q3 = 1100|1100\rangle with q4 ~ q7 = 1000|1000\rangle
  • The probability of q0~q3 = 1100|1100\rangle with q4 ~ q7 = 1001|1001\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 1010|1010\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 1011|1011\rangle
  • The probability of q0~q3 = 1100|1100\rangle with q4 ~ q7 = 1100|1100\rangle
  • The probability of q0~q3 = 1100|1100\rangle with q4 ~ q7 = 1101|1101\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 1110|1110\rangle
  • The probability of q0~q3 = 1000|1000\rangle with q4 ~ q7 = 1111|1111\rangle

In the same way, we can write down all outputs’ probability to formula.

p0 =  -q0*q3*q4*q6*q7*(q1 - 16)*(q2 - 16)*(q5 - 16) - q0*q4*q5*q6*q7*(q1 - 16)*(q2 - 16)*(q3 - 16) - q1*q2*q3*q6*q7*(q0 - 16)*(q4 - 16)*(q5 - 16) + q1*q3*q4*q7*(q0 - 16)*(q2 - 16)*(q5 - 16)*(q6 - 16) - q1*q3*q6*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) + q1*q3*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q1*q4*q5*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q6 - 16) - q1*q5*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) + q2*q5*q6*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16) - q3*q4*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q5 - 16)*(q7 - 16) + q3*q4*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q3*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) - q4*q5*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q7 - 16) + q4*q5*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) + q5*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) - q5*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16)
p1 = q3*(q0*q1*q2*q6*q7*(q4 - 16)*(q5 - 16) + q0*q1*q6*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) - q0*q1*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*q4*q6*q7*(q1 - 16)*(q5 - 16) + q0*q4*q5*q6*q7*(q1 - 16)*(q2 - 16) - q0*q7*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) - q1*q2*q4*q7*(q0 - 16)*(q5 - 16)*(q6 - 16) + q1*q2*q5*q6*q7*(q0 - 16)*(q4 - 16) - q1*q4*q5*q7*(q0 - 16)*(q2 - 16)*(q6 - 16) + q1*q5*q6*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q7 - 16) - q1*q5*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q2*q4*q6*(q0 - 16)*(q1 - 16)*(q5 - 16)*(q7 - 16) - q2*q4*(q0 - 16)*(q1 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q4*q5*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q7 - 16) - q4*q5*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q6 - 16)*(q7 - 16) - q5*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q6 - 16))
p2 = q0*q1*q2*q3*q4*q7*(q5 - 16)*(q6 - 16) + q0*q1*q2*q3*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q1*q3*q4*q5*q7*(q2 - 16)*(q6 - 16) + q0*q1*q3*q4*q6*q7*(q2 - 16)*(q5 - 16) + q0*q1*q4*q5*q6*q7*(q2 - 16)*(q3 - 16) + q0*q2*q3*q4*(q1 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*q3*q7*(q1 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q0*q3*q4*q5*(q1 - 16)*(q2 - 16)*(q6 - 16)*(q7 - 16) + q1*q2*q3*q5*(q0 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) - q1*q2*q5*q6*q7*(q0 - 16)*(q3 - 16)*(q4 - 16) + q1*q3*q4*q6*(q0 - 16)*(q2 - 16)*(q5 - 16)*(q7 - 16) + q1*q4*q5*q6*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q7 - 16) - q1*q5*q6*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) + q2*q3*q5*q7*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q6 - 16) + q2*q3*q6*q7*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q5 - 16) + q3*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16)
p3 = -q0*q1*q2*q3*q4*q6*q7*(q5 - 16) - q0*q1*q3*q4*q5*q6*q7*(q2 - 16) - q0*q1*q3*q4*q7*(q2 - 16)*(q5 - 16)*(q6 - 16) - q0*q1*q4*q5*q7*(q2 - 16)*(q3 - 16)*(q6 - 16) - q0*q2*q3*q6*q7*(q1 - 16)*(q4 - 16)*(q5 - 16) - q0*q3*q4*(q1 - 16)*(q2 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q0*q3*q6*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) - q0*q4*q5*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) - q1*q2*q3*q4*q6*(q0 - 16)*(q5 - 16)*(q7 - 16) - q1*q2*q3*(q0 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q1*q2*q5*q7*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) - q1*q3*q4*q5*q6*(q0 - 16)*(q2 - 16)*(q7 - 16) - q2*q3*q5*q6*q7*(q0 - 16)*(q1 - 16)*(q4 - 16) - q2*q3*q7*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q2*q5*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) - q3*q5*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q7 - 16)
p4 = -q0*q1*q2*q3*q6*(q4 - 16)*(q5 - 16)*(q7 - 16) + q0*q1*q2*q4*q5*q7*(q3 - 16)*(q6 - 16) - q0*q1*q2*q5*q7*(q3 - 16)*(q4 - 16)*(q6 - 16) - q0*q2*q3*q4*q6*(q1 - 16)*(q5 - 16)*(q7 - 16) - q0*q3*q4*q5*q6*(q1 - 16)*(q2 - 16)*(q7 - 16) + q0*q3*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q4*q6*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16) + q0*q5*q6*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16) + q1*q2*q3*q4*(q0 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q1*q2*q3*q5*q6*(q0 - 16)*(q4 - 16)*(q7 - 16) + q1*q3*q4*q5*(q0 - 16)*(q2 - 16)*(q6 - 16)*(q7 - 16) - q1*q4*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) + q1*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) - q2*q4*q5*q6*q7*(q0 - 16)*(q1 - 16)*(q3 - 16) - q2*q6*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) + q3*q5*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16)
p5 = -q0*q1*q2*q3*q4*q5*q7*(q6 - 16) + q0*q1*q3*q5*q6*q7*(q2 - 16)*(q4 - 16) - q0*q1*q7*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) - q0*q2*q3*q5*q7*(q1 - 16)*(q4 - 16)*(q6 - 16) - q0*q2*q4*q6*q7*(q1 - 16)*(q3 - 16)*(q5 - 16) + q0*q2*q6*q7*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) + q0*q3*q4*q6*(q1 - 16)*(q2 - 16)*(q5 - 16)*(q7 - 16) + q0*q4*q5*q6*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q7 - 16) + q1*q2*q3*q6*(q0 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) + q1*q2*q4*q7*(q0 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) - q1*q3*q4*(q0 - 16)*(q2 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q1*q4*q5*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) + q1*q5*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q2*q3*q4*q5*q6*q7*(q0 - 16)*(q1 - 16) - q2*q5*q6*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) - q3*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16)
p6 = q0*q1*q2*q3*q4*q6*(q5 - 16)*(q7 - 16) - q0*q1*q2*q4*q7*(q3 - 16)*(q5 - 16)*(q6 - 16) + q0*q1*q2*q7*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q0*q1*q3*q4*q5*q6*(q2 - 16)*(q7 - 16) + q0*q1*q3*q4*(q2 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q1*q4*q5*(q2 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) - q0*q1*q4*q6*q7*(q2 - 16)*(q3 - 16)*(q5 - 16) - q0*q1*q5*q6*q7*(q2 - 16)*(q3 - 16)*(q4 - 16) + q0*q2*q3*q6*(q1 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) + q0*q3*q5*q7*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q6 - 16) + q1*q2*q3*q4*q5*q7*(q0 - 16)*(q6 - 16) + q1*q2*q4*q5*q6*q7*(q0 - 16)*(q3 - 16) - q1*q2*q5*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q1*q2*q6*q7*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) + q2*q3*q5*q6*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q7 - 16) + q2*q3*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16)
p7 = -q0*q1*q2*q3*q4*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q1*q2*q4*q6*q7*(q3 - 16)*(q5 - 16) - q0*q1*q2*q6*q7*(q3 - 16)*(q4 - 16)*(q5 - 16) - q0*q1*q3*q4*q5*(q2 - 16)*(q6 - 16)*(q7 - 16) - q0*q1*q3*q4*q6*(q2 - 16)*(q5 - 16)*(q7 - 16) - q0*q1*q4*q5*q6*(q2 - 16)*(q3 - 16)*(q7 - 16) + q0*q1*q4*q7*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) + q0*q1*q5*q7*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) - q0*q2*q3*(q1 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q0*q3*q5*q6*q7*(q1 - 16)*(q2 - 16)*(q4 - 16) - q1*q2*q3*q4*q5*q6*q7*(q0 - 16) - q1*q2*q4*q5*q7*(q0 - 16)*(q3 - 16)*(q6 - 16) + q1*q2*q5*q6*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) - q1*q2*q7*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) - q2*q3*q5*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) - q2*q3*q6*(q0 - 16)*(q1 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16)
p8 = -q0*q2*q4*q5*q6*(q1 - 16)*(q3 - 16)*(q7 - 16) + q0*q2*q4*q5*(q1 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*q5*q6*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) - q0*q2*q5*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q1*q3*q6*q7*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16) - q1*q3*q7*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q3*q4*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q5 - 16) - q3*q4*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q5 - 16)*(q6 - 16) + q4*q5*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16) - q4*q5*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q6 - 16) + q4*q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) - q4*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q5*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16) + q5*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) - q6*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) + (q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16)
p9 = q0*q1*q2*q3*q5*q6*(q4 - 16)*(q7 - 16) - q0*q1*q2*q3*q5*(q4 - 16)*(q6 - 16)*(q7 - 16) - q0*q1*q3*q6*q7*(q2 - 16)*(q4 - 16)*(q5 - 16) + q0*q1*q3*q7*(q2 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q0*q2*q3*q4*q5*q6*(q1 - 16)*(q7 - 16) - q0*q2*q3*q4*q5*(q1 - 16)*(q6 - 16)*(q7 - 16) + q0*q6*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) - q0*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q1*q3*q5*q6*q7*(q0 - 16)*(q2 - 16)*(q4 - 16) + q1*q3*q5*q7*(q0 - 16)*(q2 - 16)*(q4 - 16)*(q6 - 16) - q2*q3*q4*q6*q7*(q0 - 16)*(q1 - 16)*(q5 - 16) + q2*q3*q4*q7*(q0 - 16)*(q1 - 16)*(q5 - 16)*(q6 - 16) - q2*q4*q6*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) + q2*q4*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q3*q4*q5*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16) + q3*q4*q5*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q6 - 16)
p10 = -q0*q1*q2*q3*q7*(q4 - 16)*(q5 - 16)*(q6 - 16) + q0*q1*q2*q4*q5*q6*(q3 - 16)*(q7 - 16) - q0*q1*q2*q5*q6*(q3 - 16)*(q4 - 16)*(q7 - 16) + q0*q1*q3*q5*(q2 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) - q0*q2*q3*q4*q7*(q1 - 16)*(q5 - 16)*(q6 - 16) - q0*q2*q4*(q1 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q0*q3*q4*q5*q7*(q1 - 16)*(q2 - 16)*(q6 - 16) - q1*q2*q3*q5*q7*(q0 - 16)*(q4 - 16)*(q6 - 16) - q1*q3*q4*q6*q7*(q0 - 16)*(q2 - 16)*(q5 - 16) - q1*q4*q5*q6*q7*(q0 - 16)*(q2 - 16)*(q3 - 16) - q1*q4*q6*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) + q1*q5*q6*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16) + q1*q6*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) + q2*q3*q4*q5*(q0 - 16)*(q1 - 16)*(q6 - 16)*(q7 - 16) - q3*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16)
p11 = -q0*q1*q2*q3*q4*q5*q6*(q7 - 16) - q0*q1*q6*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) - q0*q2*q3*q5*q6*(q1 - 16)*(q4 - 16)*(q7 - 16) + q0*q3*q4*q7*(q1 - 16)*(q2 - 16)*(q5 - 16)*(q6 - 16) + q0*q3*q6*q7*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q5 - 16) + q0*q4*q5*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q6 - 16) + q0*q4*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q5*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q1*q2*q3*q4*q6*q7*(q0 - 16)*(q5 - 16) + q1*q2*q3*q7*(q0 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q1*q2*q4*q6*(q0 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) + q1*q3*q4*q5*q6*q7*(q0 - 16)*(q2 - 16) - q2*q4*q5*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) - q2*q5*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) - q2*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q3*q5*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q4 - 16)
p12 = q0*q1*q2*q3*q4*q5*(q6 - 16)*(q7 - 16) - q0*q1*q3*q5*q6*(q2 - 16)*(q4 - 16)*(q7 - 16) + q0*q1*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*q3*q5*(q1 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*q4*q5*q6*q7*(q1 - 16)*(q3 - 16) - q0*q2*q4*q5*q7*(q1 - 16)*(q3 - 16)*(q6 - 16) + q0*q2*q4*q6*(q1 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) - q0*q2*q5*q6*q7*(q1 - 16)*(q3 - 16)*(q4 - 16) + q0*q2*q5*q7*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) - q0*q2*q6*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) - q1*q2*q4*(q0 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q2*q3*q4*q5*q6*(q0 - 16)*(q1 - 16)*(q7 - 16) - q4*q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16) + q4*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) + q6*q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) - q7*(q0 - 16)*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)
p13 = -q0*q1*q2*q3*q5*q6*q7*(q4 - 16) + q0*q1*q2*q3*q5*q7*(q4 - 16)*(q6 - 16) - q0*q1*q2*q4*q5*(q3 - 16)*(q6 - 16)*(q7 - 16) + q0*q1*q2*q5*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) - q0*q2*q3*q4*q5*q6*q7*(q1 - 16) + q0*q2*q3*q4*q5*q7*(q1 - 16)*(q6 - 16) - q0*q4*q6*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) - q0*q5*q6*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) - q0*q6*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) + q0*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q1*q4*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q1*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q2*q4*q5*q6*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q7 - 16) + q2*q4*q6*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q5 - 16) - q2*q4*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) + q2*q6*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16)
p14 = -q0*q1*q2*q4*q5*q6*q7*(q3 - 16) - q0*q1*q2*q4*q6*(q3 - 16)*(q5 - 16)*(q7 - 16) + q0*q1*q2*q5*q6*q7*(q3 - 16)*(q4 - 16) + q0*q1*q2*q6*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) - q0*q1*q3*q5*q7*(q2 - 16)*(q4 - 16)*(q6 - 16) - q0*q1*q4*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q0*q1*q5*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) + q0*q2*q4*q7*(q1 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) - q0*q2*q7*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16) + q0*q3*q5*q6*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q7 - 16) + q1*q2*q3*q4*q5*q6*(q0 - 16)*(q7 - 16) + q1*q2*q4*q5*(q0 - 16)*(q3 - 16)*(q6 - 16)*(q7 - 16) + q1*q2*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q1*q4*q6*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16) - q1*q6*q7*(q0 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) - q2*q3*q4*q5*q7*(q0 - 16)*(q1 - 16)*(q6 - 16)
p15 = q0*q1*q2*q3*q4*q5*q6*q7 + q0*q1*q2*q4*(q3 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) - q0*q1*q2*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)*(q7 - 16) + q0*q1*q4*q6*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q7 - 16) + q0*q1*q5*q6*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q7 - 16) + q0*q1*q6*q7*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16) + q0*q2*q3*q5*q6*q7*(q1 - 16)*(q4 - 16) - q0*q3*q5*(q1 - 16)*(q2 - 16)*(q4 - 16)*(q6 - 16)*(q7 - 16) - q0*q4*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q5 - 16)*(q6 - 16) - q0*q5*q7*(q1 - 16)*(q2 - 16)*(q3 - 16)*(q4 - 16)*(q6 - 16) - q1*q2*q3*q4*q5*(q0 - 16)*(q6 - 16)*(q7 - 16) - q1*q2*q4*q5*q6*(q0 - 16)*(q3 - 16)*(q7 - 16) - q1*q2*q4*q6*q7*(q0 - 16)*(q3 - 16)*(q5 - 16) - q1*q2*q6*(q0 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q7 - 16) + q2*q4*q5*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q6 - 16) + q2*q7*(q0 - 16)*(q1 - 16)*(q3 - 16)*(q4 - 16)*(q5 - 16)*(q6 - 16)

4. Brute force to get flag.

for (int q0 = 0; q0 < 16; q0++)
for (int q1 = 0; q1 < 16; q1++)
for (int q2 = 0; q2 < 16; q2++)
for (int q3 = 0; q3 < 16; q3++)
for (int q4 = 0; q4 < 16; q4++)
for (int q5 = 0; q5 < 16; q5++)
for (int q6 = 0; q6 < 16; q6++)
for (int q7 = 0; q7 < 16; q7++){
...
long long int diff = p1+p2+p3+ ... +p15;
}

the smallest diff with the file result will be the flag.

flag{95066ebd}

solve.py
brute.cpp