C0D3Matr1x - CODEGATE 2025 Quals
以下のような行列演算をしている
code:python
import struct
import numpy as np
from sympy import Matrix
WIDTH = 24
PADDING = 26
MAT_SIZE = 576 # 24 x 24
MOD = 0xFFFF
with open('new-prob', 'rb') as f:
data = f.read()
a2 = np.array(struct.unpack_from("<{}I".format(MAT_SIZE), data, 0x3220), dtype=np.uint32).reshape((24, 24))
answer = np.array(struct.unpack_from("<{}I".format(MAT_SIZE), data, 0x5620), dtype=np.uint32).reshape((24, 24))
dword_4D20 = np.array(struct.unpack_from("<{}I".format(MAT_SIZE), data, 0x4d20), dtype=np.uint32).reshape((24, 24))
dword_3B20 = np.array(struct.unpack_from("<{}I".format(MAT_SIZE), data, 0x3b20), dtype=np.uint32).reshape((24, 24))
dword_4420 = np.array(struct.unpack_from("<{}I".format(MAT_SIZE), data, 0x4420), dtype=np.uint32).reshape((24, 24))
v19 = np.zeros((24, 24), dtype=np.uint32)
for i in range(12):
if i % 2 == 1:
else:
def conv_add(mat_input):
out = np.zeros((24, 24), dtype=np.uint32)
for i in range(24):
for j in range(24):
sum9 = 0
return out
def rot_counterclock_90(mat):
return np.rot90(mat, k=1)
def rot_clock_90(mat):
return np.rot90(mat, k=-1)
def addmod_unsigned(a, b):
return (a + b) % 0xFFFF
def inv_addmod_unsigned(a, b):
return (a.astype(np.uint32) - b.astype(np.uint32)) % 0xFFFF.astype(np.uint32)
def addmod_signed(a, b):
return ((a.astype(np.int32) + b.astype(np.int32)) % 0xFFFF).astype(np.int32)
def inv_addmod_signed(a, b):
return ((a.astype(np.int32) - b.astype(np.int32)) % 0xFFFF).astype(np.int32)
def mul(a, b):
return np.dot(a, b) % 0xFFFF
def inv_mul(a, b):
b_inv = np.array(Matrix(b.tolist()).inv_mod(MOD).tolist(), dtype=np.uint32)
# b_inv = np.linalg.inv(b)
return np.dot(a, b_inv) % 0xFFFF
input_data = input("Enter 484 chars: ")
input_data += "\0" * (484 - len(input_data))
mat_input = np.zeros((26 * 26,), dtype=np.uint32)
v7 = 0
for j in range(2, 24):
for k in range(2, 24):
v7 += 1
for m in range(1, 25):
for n in range(1, 25):
idx = PADDING * m + n
v1 = conv_add(mat_input)
v2 = rot_counterclock_90(v1)
v3 = mul(v2, v19)
v4 = mul(v19, v3)
v5 = rot_clock_90(v4)
v6 = addmod_unsigned(v5, a2)
v7 = mul(v6, dword_4D20)
v8 = addmod_signed(v7, dword_3B20)
inv_v7 = inv_addmod_signed(v8, dword_3B20)
assert np.array_equal(v7, inv_v7)
inv_v6 = inv_mul(inv_v7, dword_4D20)
assert np.array_equal(v6, inv_v6)
if np.array_equal(v8, answer):
print("Correct")
else:
print("Wrong")
Yu君にこれを投げたら解いてくれた