Vectors

문제(및 설명)

먼저 격자를 정의하거나 암호학에서 격자가 어떻게 나타나는지에 대해 이야기하기 전에, 선형 대수의 기본 사항을 살펴보겠습니다. 다음 도전 과제들은 복습으로 간주되어야 하며, 만약 이것이 완전히 처음이라면 약간의 백그라운드 독서가 필요할 수 있습니다. 여전히 우리는 "수학적 암호학 입문" (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)

3 * (2v - w) ∙ 2u

여기서 v = (2,6,3), w = (1,0,0) 및 u = (7,7,2)이다.

먼저 식을 계산해 보면

2v = 2 * (2,6,3) = (4,12,6)
2v - w = (4,12,6) - (1,0,0) = (3,12,6)

그 다음에 내적을 계산합니다:

3*(3,12,6) ∙ 2u = 9*14+ 36*14 + 18*4 = 72 + 504 + 126 = 702

따라서 3*(2v - w) ∙ 2u의 결과, 즉 플래그 값은 702입니다.

복사했습니다!