기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[Probability]순열(permutation)

순열(Permutaion)

경우의 수

주사위 2개를 시행할 경우 발생되는 모든 경우는 다음과 같습니다.
    event=[]
    for i in range(1, 7):
      for j in range(1, 7):
        event.append((i, j))

    print(event, end="")
      [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]
(1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (2, 1) (2, 2) (2, 3) (2, 4) (2, 5) (2, 6) (3, 1) (3, 2) (3, 3) (3, 4) (3, 5) (3, 6) (4, 1) (4, 2) (4, 3) (4, 4) (4, 5) (4, 6) (5, 1) (5, 2) (5, 3) (5, 4) (5, 5) (5, 6) (6, 1) (6, 2) (6, 3) (6, 4) (6, 5) (6, 6)
위 결과는 다음과 같이 정리할 수 있습니다. 첫번째 주사위의 각 점의 수에서 두번째 주사위의 1~6의 점들을 모든 점들을 갖는 경우들을 나타냅니다. 그러므로 6 × 6으로 계산할 수 있습니다. 이것은 다음과 같이 일반화할 수 있습니다.
두 실험을 실행하는 경우 실험 1와 2 에서 발생할 수 있는 모든 경우가 m과 n이라면 두 실험을 함께 시행할 경우 발생하는 모든 경우의 수는 m × n 으로 계산합니다.
예) 3개의 파란공과 10개의 빨간공을 쌍으로 연결할 경우 발생하는 경우는 다음과 같습니다.
    blue=['b'+str(i) for i in range(1, 4)]
    red=['r'+str(j) for j in range(1, 11)]

      blue
    ['b1', 'b2', 'b3']
      red
    ['r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 'r10']
    re=[]
    for i in blue:
      print( )
      for j in red:
        print((i, j), end="")
        re.append((i, j))
      ('b1', 'r1')('b1', 'r2')('b1', 'r3')('b1', 'r4')('b1', 'r5')('b1', 'r6')('b1', 'r7')('b1', 'r8')('b1', 'r9')('b1', 'r10')
      ('b2', 'r1')('b2', 'r2')('b2', 'r3')('b2', 'r4')('b2', 'r5')('b2', 'r6')('b2', 'r7')('b2', 'r8')('b2', 'r9')('b2', 'r10')
      ('b3', 'r1')('b3', 'r2')('b3', 'r3')('b3', 'r4')('b3', 'r5')('b3', 'r6')('b3', 'r7')('b3', 'r8')('b3', 'r9')('b3', 'r10')

    allCase=len(re)
    allCase
      30

    allCase2=3*10 #위 공식을 적용(n × m)
    allCase2
      30
예) 1학년 3명, 2학년 5명, 3학년의 2명으로 구성된 클래스에서 3명으로 구성된 소그룹을 만들수 있는 경우의 수를 생각해 봅니다.
    f=["f"+ str(i) for i in range(1, 4)]
    s=["s"+ str(i) for i in range(1, 6)]
    j=["j"+ str(i) for i in range(1, 3)]
    f
      ['f1', 'f2', 'f3']

    s
      ['s1', 's2', 's3', 's4', 's5']

    j
      ['j1', 'j2']

    re=[]
    for l in f:
      print()
      for m in s:
        print()
        for n in j:
          print((l, m, n), end="")
          re.append((i, s, j))
      ('f1', 's1', 'j1')('f1', 's1', 'j2')
      ('f1', 's2', 'j1')('f1', 's2', 'j2')
      ('f1', 's3', 'j1')('f1', 's3', 'j2')
      ('f1', 's4', 'j1')('f1', 's4', 'j2')
      ('f1', 's5', 'j1')('f1', 's5', 'j2')

      ('f2', 's1', 'j1')('f2', 's1', 'j2')
      ('f2', 's2', 'j1')('f2', 's2', 'j2')
      ('f2', 's3', 'j1')('f2', 's3', 'j2')
      ('f2', 's4', 'j1')('f2', 's4', 'j2')
      ('f2', 's5', 'j1')('f2', 's5', 'j2')

      ('f3', 's1', 'j1')('f3', 's1', 'j2')
      ('f3', 's2', 'j1')('f3', 's2', 'j2')
      ('f3', 's3', 'j1')('f3', 's3', 'j2')
      ('f3', 's4', 'j1')('f3', 's4', 'j2')
      ('f3', 's5', 'j1')('f3', 's5', 'j2')

    AllCase=len(re)
    AllCase
      30
위 예의 총 경우의 수는 30으로 위 정의를 확장하여 다음과 같이 계산할 수 있습니다.
    각 시험은 n1, n2, ..., nr로 구성된 r개의 실험들에서 총 경우의 수는 다음과 같이 계산됩니다.
      n1 × n2 × ... × nr
예) 비밀번호를 8개를 생성하고자 합니다. 처음 4개는 알파벳 문자이고 나머지 4개는 숫자로 구성하여야 하는 경우 다른 번호를 생성할 모든 경우의 수는?
    26*26*26*26*10*10*10*10
      4569760000
위의 예에서 반복이 허가되지 않은 경우?
    26*(26-1)*(26-2)*(26-3)*10*(10-1)*(10-2)*(10-3)
      1808352000

Permutation

문자 a, b, c를 순서있게 배열하는 경우는 다음과 같습니다.
abc acb bac bca cab cba
총 6개의 경우의 수가 존재합니다. 이와같이 샘플들을 순서를 고려하여 반복 없이 정렬하는 배열방법을 permutation이라고 합니다. permutatioin의 경우의 수는 다음과 같이 계산할 수 있습니다.
3·2·1 = 6
    위의 식을 일반화하면 n개의 샘플들을 순서있게 배열하는 총 경우의 수는 다음과 같습니다.
      n·(n-1)·(n-2)·…·2·1 = n!
      factorial(!)은 python의 math 모듈 함수 factorial()을 사용하여 계산할 수 있습니다.
permutation은 python의 itertools 모듈의 함수를 사용하여 계산할 수 있습니다.
  • itertools.permutations(x, n): 객체 x에서 n개를 선택하여 정렬시킨 결과를 반환
    • import itertools
      list(itertools.permutations(da, 3))
        [('a', 'b', 'c'),
        ('a', 'c', 'b'),
        ('b', 'a', 'c'),
        ('b', 'c', 'a'),
        ('c', 'a', 'b'),
        ('c', 'b', 'a')]
    야구 팀 타자들의 순서를 정하는 방법 역시 순열과 같습니다.
      import math
      math.factorial(9)
        362880

      x=list(range(1, 10))
      list(itertools.permutations(x, 9))
        [(1, 2, 3, 4, 5, 6, 7, 8, 9),
        (1, 2, 3, 4, 5, 6, 7, 9, 8),
        … ]
    10권 책들을 정리하려고 합니다. 3권은 소설, 4권을 전공서적, 3권은 만화책입니다.
    정리할 수 있는 총 경우의 수는 10!이 됩니다. 그러면 각 분야별로 정리하는 방법의 수는 어떻게 계산될까요?
    소설: 3!, 전공서적: 4!, 만화: 3! 그리고 각 분야를 나열하는 방법:3!을 고려합니다.
      x=[3,4,3,3]
      re=1
      for i in x:
        re *= math.factorial(i)
      re
        5184
    위의 예에서 각 분야의 책들이 같다면 분야내에서 순서는 의미가 없을 것입니다. 이 경우 배열 방법은 어떻게 계산할까요? 이문제를 고려하기전에 간단한 예인 a,a,b의 정렬을 생각해 봅니다. 먼저 a를 a1과 a2로 구분하여 정렬하여 보면 다음과 같이 6가지 방법으로 정렬할 수 있습니다.
      x=['a1', 'a2', 'b']
      list(enumerate(itertools.permutations(x, 3)))
        [(0, ('a1', 'a2', 'b')),
        (1, ('a1', 'b', 'a2')),
        (2, ('a2', 'a1', 'b')),
        (3, ('a2', 'b', 'a1')),
        (4, ('b', 'a1', 'a2')),
        (5, ('b', 'a2', 'a1'))]
    위 결과에서 a1=a2라면 b의 위치에 따라 다음과 같이 고려할 수 있습니다.
    • ('a1', 'a2', 'b') = ('a2', 'a1', 'b')
    • ('a1', 'b', 'a2') = ('a2', 'b', 'a1'))
    • ('b', 'a1', 'a2') = ('b', 'a2', 'a1')
    결과적으로 다음과 같이 계산할 수 있습니다.
    3!2!
    이러한 계산과정은 다음과 같이 일반화 할 수 있습니다.
      전체 객체의 수 n 개가 다음과 같이 구성되어 있는 경우
        n=n1+n2+…+nr-1+nr
      위 객체를 정렬하는 총 경우의 수는 다음과 같이 계산할 수 있습니다.
        n! n1! n2! n(r-1)! nr!
    위 식을 적용하여 서적 배열 방법의 경우의 수는 다음과 같습니다.
      p=[3,4,3]
      re1=1
      for i in p:
        re1 *= math.factorial(i)
      re1
        864

      math.factorial(10)/re1
        4200.0

    댓글

    이 블로그의 인기 게시물

    [Linear Algebra] 유사변환(Similarity transformation)

    유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

    [sympy] Sympy객체의 표현을 위한 함수들

    Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

    sympy.solvers로 방정식해 구하기

    sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...