# System of Equations
> 1 chút hệ phương trình
$$
\begin{equation}
\begin{cases}
x^2+2xy+8z=4z^2+4y+8\\
x^2+y+2z=4(2p+1)
\end{cases}\
\end{equation}
$$
```python
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import hashlib
import os
FLAG = b'W1{???}'
x = int(input("Nhap x nguyen: "))
y = int(input("Nhap y nguyen: "))
z = int(input("Nhap z nguyen: "))
assert x**2 + 2*x*y - 8 == 4*z**2 + 4*y - 8*z
assert x**5 + y**3 == 10823714993004958804353333960725385073542379465721 - z**4
assert 8864612849141*x**2 + 8864612849141*y + 17729225698282*z == 205022233466935232483321764396
mode = str(input("Nhap phuong thuc (encrypt hoac decrypt): "))
secret = (str(x**10) + str(y**10) + str(z**10)).encode()
key = hashlib.sha256(secret).digest()
if mode == "encrypt":
iv = os.urandom(16)
c = AES.new(key, AES.MODE_CBC, iv).encrypt(pad(FLAG, 16))
print(f'iv = {iv}')
print(f'ciphertext = {c}')
elif mode == "decrypt":
iv = b'\x8d\r\x19\xbc\xfd\x84\x13N,\xf85\xdb\xd3\x92i\x93'
ciphertext = b'\xe9\xa2\x8c\x8b\xc3\xb4\x88\xe2\xbb\x96\xc6\xac`\x1c}\xd1\xca\xc1ZB\xf1@\x01\x92\xca\xc4Z[\x96o\xdeFv\xdf\r\x13u+\x89\xac3\xa3\xc9X\xfb\x07u\x1bO\x9c\xb0\xbdN\xa4\xb6\xca&T\xabmx\xdb\xae\xc2'
FLAG = unpad(AES.new(key, AES.MODE_CBC, iv).decrypt(ciphertext), 16)
print(FLAG.decode())
else:
exit(1)
```
### Giải
Phương trình đầu cho ta biết rằng x chẵn, sau đó phương trình thứ 2 cho ta biết y chẵn.
Đặt $x=2x_1, y=2y_1$, hệ phương trình trở thành:
$$
\begin{equation}
\begin{cases}
x_1^2+2x_1y_1+2z=z^2+2y_1+2\\
2x_1^2+y_1+z=2(2p+1)
\end{cases}\
\end{equation}
$$
Tiếp tục, phương trình 1 cho ta biết: $x_1\equiv z\mod 2$, phương trình 2 cho ta biết: $x_1\equiv z\mod 2$. Nếu $x_1, y_1, z$ chẵn, phương trình 1 không thỏa vì vế trái chia hết cho 4, vế phải $\equiv 2\mod 4$.
Như vậy, tất cả cùng lẻ. Đặt $x_1=2u+1, y_1 = 2v-1,z=2w+1$ và hệ trở thành:
$$
\begin{equation}
\begin{cases}
u^2+2uv=w^2\\
4u^2+4u+v+w=2p
\end{cases}\
\end{equation}
$$
1) Nếu $u=0$
Nghĩa là w = 0 và v = 2p và có nghiệm $(x, y, z) = (2, 8p-2, 1)$
2) Nếu $u\ne0$
Phương trình đầu chứng minh là $u|w^2$ và vì thế ta có thể viết $u=ab^2, w=abc$ với 1 vài số square-free a và b, c khác 0.
Hệ trở thành:
$$
\begin{equation}
\begin{cases}
v=\dfrac{a(c^2-b^2)}{2}\\
v=2p-4a^2b^4-4ab^2-abc
\end{cases}\
\end{equation}
$$
và từ đó: $a(c^2-b^2)$ chẵn và $a(c^2-b^2)=4p-8a^2b^4-8ab^2-2abc$
$\Leftrightarrow a(b+c)^2=4p-8a^2b^4-8ab^2 \ (1)$
Vì thế số square-free a chia hết 4p và $a\in \{1,2, p, 2p\}$ vì a dương
Đặt $(b+c)=N$, phương trình trở thành: $(8ab^2+3)^2+8aN=32p+9$
Vì a > 0, ta có $8ab^2+3\le\sqrt{32p+9}$ và từ đó $1\le b^2\le\dfrac{\sqrt{32p+9}-3}{8a}$
Suy ra: $a\le\dfrac{\sqrt{32p+9}-3}{8}$. Rõ ràng, $\dfrac{\sqrt{32p+9}-3}{8} < p,\forall p>1\Leftrightarrow\sqrt{32p+9}<8p+3,\forall p>1\Leftrightarrow64p^2-16p>0,\forall p>1$
Nghĩa là $a < p$ nên a chỉ nhận được hai giá trị $\{ 1, 2\}$.
- $a = 1$, thay vào $(1)$ ta có: $-8b^4-6b^2+4p$ là số chính phương k nào đó
- $a = 2$, thay vào $(1)$ ta có: $-16b^4-6b^2+2p$ là số chính phương k nào đó
Brute-force đoạn này sẽ đơn giản và ta sẽ có bộ nghiệm:
$(x,y,z)=(4ab^2+2,2a(c^2-b^2)-2,2abc+1)$, với $c = \sqrt{k} - b$
Script:
```python
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from tqdm import trange
import hashlib, math
def check_scp(n: int) -> bool:
if n < 0:
return False
root = int(math.isqrt(n))
return root * root == n
ans = 23128165544962556
p = (ans - 4) // 8
print("Voi a = 1: ")
a = 1
for b in trange(2**12):
k = -8*b**4 - 6*b**2+4*p
if check_scp(k):
cp = math.isqrt(k)
c = cp - b
x, y, z = 4*a*b**2+2, 2*a*(c**2-b**2) - 2, 2*a*b*c + 1
print(f'Bộ nghiệm: {x, y, z}')
print("Voi a = 2: ")
a = 2
for b in trange(2**12):
k = -16*b**4 - 6*b**2+2*p
if check_scp(k):
cp = math.isqrt(k)
c = cp - b
x, y, z = 4*a*b**2+2, 2*a*(c**2-b**2) - 2, 2*a*b*c + 1
print(f'Bộ nghiệm: {x, y, z}')
secret = (str(x**10) + str(y**10) + str(z**10)).encode()
key = hashlib.sha256(secret).digest()
# copy the iv and ciphertext
iv = b'\x8d\r\x19\xbc\xfd\x84\x13N,\xf85\xdb\xd3\x92i\x93'
ciphertext = b'\xe9\xa2\x8c\x8b\xc3\xb4\x88\xe2\xbb\x96\xc6\xac`\x1c}\xd1\xca\xc1ZB\xf1@\x01\x92\xca\xc4Z[\x96o\xdeFv\xdf\r\x13u+\x89\xac3\xa3\xc9X\xfb\x07u\x1bO\x9c\xb0\xbdN\xa4\xb6\xca&T\xabmx\xdb\xae\xc2'
FLAG = unpad(AES.new(key, AES.MODE_CBC, iv).decrypt(ciphertext), 16)
print(FLAG.decode())
# https://artofproblemsolving.com/community/c6t281f6h1965032_problem_6_of_third_round
```