먼저 격자를 정의하거나 암호학에서 격자가 어떻게 나타나는지에 대해 이야기하기 전에, 선형 대수의 기본 사항을 살펴보겠습니다. 다음 도전 과제들은 복습으로 간주되어야 하며, 만약 이것이 완전히 처음이라면 약간의 백그라운드 독서가 필요할 수 있습니다. 여전히 우리는 "수학적 암호학 입문" (Hoffstein, Pipher, Silverman) 및 격자 및 그 응용에 대한 이 훌륭한 소개를 추천합니다.
벡터 공간 V는 필드 F 위에서 정의된 집합으로, 두 개의 이항 연산자로 구성됩니다. 벡터 v ∈ V 및 스칼라 a ∈ F에 대해, 벡터 합은 두 개의 벡터를 가져와서 다른 벡터를 생성합니다: v + w = z, 여기서 v, w, z ∈ V 및 스칼라 곱은 벡터와 스칼라를 가져와서 다른 벡터를 생성합니다: a*v = w, 여기서 v, w ∈ V이고 a ∈ F입니다.
아마도 처음으로 벡터를 보게 되는 경우는 실수 위에 정의된 이차원 벡터 공간의 맥락일 것입니다. 우리는 여기서도 이것을 예로 사용할 것입니다!
실수 위의 이차원 벡터 공간을 고려해 봅시다. 벡터 v ∈ V는 숫자의 쌍으로 나타낼 수 있습니다: v = (a,b), 여기서 a, b ∈ R입니다. 벡터 합은 v + w = (a,b) + (c,d) = (a+c, b+d)로 작동하며, 스칼라 곱은 cv = c(a,b) = (ca, cb)로 작동합니다.
또한 내적(또는 점 곱)을 정의할 수 있습니다. 이는 두 벡터를 가져와 스칼라를 반환합니다. 형식적으로 우리는 v ∙ w = a라고 생각합니다. 여기서 v, w ∈ V이고 a ∈ F입니다. 이차원 예제에서 내적은 v ∙ w = (a,b) ∙ (c,d) = ac + bd로 작동합니다.
이제 플래그를 볼 시간입니다! 실수 위에서 정의된 세 차원 벡터 공간에서 v = (2,6,3), w = (1,0,0) 및 u = (7,7,2)로 주어졌을 때, 3*(2v - w) ∙ 2u를 계산하세요.
v = [2,6,3]
w = [1,0,0]
u = [7,7,2]
def list_x(a,b):
for i in range(3):
b[i]=a*b[i]
return b
def list_m(a,b):
for i in range(3):
a[i]=a[i]-b[i]
return a
def scalar(a,b):
c=0
for i in range(3):
c += a[i]*b[i]
return c
result = scalar(list_x(3,list_m(list_x(2, v), w)), list_x(2, u))
print(result)