도구스학업·수학

퍼머넌트(라이저 공식) 계산기

행렬의 퍼머넌트를 라이저 포함–배제 공식으로 O(2ⁿ·n)에 구하고 행렬식과 나란히 보여 줍니다. 부호 하나만 다른데 왜 가우스 소거가 퍼머넌트에는 통하지 않는지를 행 연산으로 직접 확인할 수 있습니다.

한 줄이 한 행입니다. 정수만 받고 18×18까지 다룹니다

퍼머넌트

10

같은 행렬의 행렬식은 -2입니다. 정의는 순열의 부호 하나만 다른데, 행렬식은 O(n³)이고 퍼머넌트는 #P-완전입니다.

크기2×2
퍼머넌트 (라이저 O(2ⁿ·n))10
순열을 모두 훑은 값 (8×8 이하)10
행렬식 (가우스 소거)-2
훑어야 할 순열 개수 n!2
라이저가 훑는 부분집합 2ⁿ4

행 연산을 해 봅니다

1 2
0 -2
행렬식 (연산 전 → 후)-2 → -2
퍼머넌트 (연산 전 → 후)10 → -2
행렬식이 보존되었나요그대로입니다
퍼머넌트가 보존되었나요바뀌었습니다

행렬식이 그대로인 것이 가우스 소거가 통하는 이유입니다. 위삼각으로 만들어 대각선만 곱하면 되니까요. 퍼머넌트는 이 성질이 없어서 같은 수법을 쓸 수 없습니다.

부호 하나가 전부인데 난이도가 하늘과 땅입니다. det는 Σ sgn(σ)·∏a[i][σ(i)] 이고 perm은 부호를 뺀 것뿐입니다. 그런데 행렬식은 가우스 소거로 O(n³)에 끝나고 퍼머넌트는 #P-완전이라, 계산복잡도 이론에서 «정의의 사소한 차이가 난이도를 가른다»는 가장 유명한 예로 꼽힙니다.
가우스 소거가 안 되는 이유는 상쇄가 없기 때문입니다. 행렬식은 부호가 있어 행 연산을 해도 더해진 항들이 서로 지워지지만, 퍼머넌트는 모든 항이 같은 부호라 지워지지 않고 값이 통째로 바뀝니다. 위에서 직접 해 보시면 바로 보입니다.
라이저 공식은 지수시간을 줄일 뿐 없애지는 못합니다. O(n!·n)을 O(2ⁿ·n)으로 줄이는 것이라 n = 20에서 2.4×10¹⁸이 10⁶으로 내려오지만, 여전히 지수입니다. 부분집합을 그레이 코드로 훑으면 한 칸 옮길 때 열 하나만 더하고 빼면 되어 안쪽 합을 다시 구하지 않아도 됩니다.
0/1 행렬이면 완전매칭 개수입니다. a[i][j]를 «i번 사람이 j번 일을 맡을 수 있는가»로 읽으면 퍼머넌트가 짝지어 주는 방법의 수가 됩니다. 매칭이 «있는가»는 다항시간에 풀리는데 «몇 개인가»는 #P-완전이라는 대비가 이 문제의 성격을 잘 보여 줍니다.

계산 방법

  1. 1정사각 행렬을 한 줄에 한 행씩 넣습니다. 정수만 받습니다.
  2. 2퍼머넌트와 행렬식이 함께 나옵니다 — 정의는 부호 하나만 다릅니다.
  3. 38×8 이하면 순열을 모두 훑은 값도 나란히 나와 검산이 됩니다.
  4. 4행 연산 단추를 눌러 «한 행에 다른 행의 배수를 더해» 봅니다.
  5. 5행렬식은 그대로인데 퍼머넌트가 바뀌는 것을 확인합니다 — 가우스 소거를 못 쓰는 이유입니다.

자주 묻는 질문

순열의 부호 sgn(σ)가 있느냐 없느냐뿐입니다. det는 Σ sgn(σ)·∏a[i][σ(i)]이고 perm은 부호를 뺀 Σ ∏a[i][σ(i)]입니다. 그런데 계산 난이도는 하늘과 땅 차이라, 행렬식은 가우스 소거로 O(n³)에 끝나고 퍼머넌트는 #P-완전입니다 — NP 문제를 모두 푸는 것보다도 어렵다고 여겨집니다.

행 연산이 값을 보존하지 않기 때문입니다. 행렬식은 «한 행에 다른 행의 상수배를 더해도 값이 그대로»라는 성질 덕분에 위삼각으로 만들어 대각선만 곱하면 되는데, 퍼머넌트에는 부호가 없어 상쇄가 일어나지 않고 그 성질이 성립하지 않습니다. 이 계산기에서 직접 행 연산을 해 보시면 행렬식은 그대로인데 퍼머넌트만 바뀌는 것이 보입니다.

순열을 모두 훑는 O(n!·n)을 O(2ⁿ·n)으로 줄입니다. n = 20이면 20! ≈ 2.4×10¹⁸과 2²⁰ ≈ 10⁶의 차이라 실용적으로 큽니다. 포함–배제로 «각 행이 고른 열의 집합»을 뒤집어 세는 것이고, 그레이 코드로 부분집합을 훑으면 한 칸 옮길 때 열 하나만 더하고 빼면 되어 안쪽 합을 다시 구하지 않아도 됩니다. 그래도 지수시간인 것은 그대로입니다.

이분 그래프의 완전매칭 개수입니다. a[i][j]를 «i번 사람이 j번 일을 맡을 수 있는가»로 읽으면 퍼머넌트가 사람과 일을 하나씩 짝지어 주는 방법의 수가 됩니다. 매칭이 «있는가»는 호프크로프트–카프로 다항시간에 풀리는데 «몇 개인가»는 #P-완전이라는 대비가 이 문제의 성격을 잘 보여 줍니다.

전부 1인 n×n 행렬의 퍼머넌트가 정확히 n!입니다. 모든 순열이 1을 주기 때문입니다. 반대로 같은 행렬의 행렬식은 0입니다. 대각선만 0이고 나머지가 1인 행렬은 퍼머넌트가 준계승 !n(교란순열의 개수)이 됩니다 — 4×4면 9, 5×5면 44입니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서만 이뤄지고, 입력값은 이 기기의 저장소에만 남습니다.

알아두면 좋은 점

  • 18×18까지 다룹니다. 2¹⁸ = 26만 번의 부분집합을 훑기 때문이며, 그 위로는 브라우저에서 버겁습니다.
  • BigInt로 계산하므로 값이 아무리 커도 정확합니다.
  • 정수만 받습니다. 실수 성분의 퍼머넌트도 같은 식으로 구할 수 있지만 반올림 오차가 쌓입니다.
  • 무작위 행렬 1100건에서 순열을 모두 훑은 값과 대조했고, 0/1 행렬에서는 완전매칭을 직접 세어 본 값과도 맞췄습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.