[14565] 역원(Inverse) 구하기 (확장 유클리드 호제법)

2023. 6. 8. 18:24·Coding Test/Math
728x90
 

14565번: 역원(Inverse) 구하기

집합 Zn을 0부터 n-1까지의 정수 집합이라고 하자. Zn ∋ a, b, c 일 때, (a+b) mod n = 0이면 b는 a의 덧셈역이라고 하고 (a*c) mod n = 1이면 c는 a의 곱셈역이라고 한다. 정수 N, A가 주어졌을 때 Zn에서의 A의

www.acmicpc.net

 

분석

덧셈역

n-a
(11 + 15) mod 26 = 0

곱셈역

xgcd(11﹡X, 26) = 1이 되는  X를 찾는 것 ➔ 11 * 𝒔 + 26 * 𝒕  = 1일 때 𝑆 값(곱셈역)
(11 * 19) mod 26 = 1
 

확장 유클리드 알고리즘

확장 유클리드 호제법 유클리드 호제법 : 두 수의 최대 공약수 구하기 확장 유클리드 호제법 : 방정식의 해 구하기 베주 항등식 (Bezout's Identity) 의 명제를 기반으로 해를 구하는 알고리즘 베주 항

karla.tistory.com

 

풀이

"""
집합 Zn을 0부터 n-1까지의 정수 집합이라고 하자.
Zn ∋ a, b, c 일 때,
(a+b) mod n = 0이면 b는 a의 덧셈역이라고 하고
(a*c) mod n = 1이면 c는 a의 곱셈역이라고 한다.

정수 N, A가 주어졌을 때 Zn에서의 A의 덧셈역과 곱셈역을 구하시오.
단, 곱셈역을 구할 수 없으면 -1을 출력한다.
"""

n,a= map(int, input().split())

addInv=n-a  # 덧셈역원
mulInv=-1  # 곱셈역원

def gcd(a, b):
    return gcd(b, a%b) if b else a

def xgcd(a, b):
    r1=a
    r2=b
    s1=t2=1
    s2=t1=0

    while True:
        q=r1//r2  # 몫
        r=r1-(q*r2)
        s = s1-(q*s2)
        t = t1-(q*t2)
        if r == 0:
            return s2

        r1 = r2
        r2 = r
        s1 = s2
        s2 = s
        t1 = t2
        t2 = t

if gcd(a,n)!=1:  #  곱셈역을 구할 수 없는 경우 -1을 출력, a*s 와 n이 서로소가 아니라는 것
    print(addInv, mulInv)
else:
    # xgcd(11*x,26)=1이 되는 x를 찾는 것 -> 11*s+26*t=1일 때 s값(곱셈역)
    mulInv=xgcd(a,n)
    while mulInv<=0:  # s가 양수인 경우
        mulInv+=n

print(addInv, mulInv)

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Coding Test/Math' 카테고리의 다른 글
  • [1011] Fly me to the Alpha Centauri
  • [2960] 에라토스테네스의 체
  • [21568] Ax+By=C (확장 유클리드 호제법)
  • 확장 유클리드 알고리즘
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    그리디
    백준
    Algorithm
    BFS
    조합
    최단거리
    프로그래머스
    그래프
    재귀
    다익스트라
    최소신장트리
    힙
    덱
    DFS
    LIS
    정렬
    알고리즘
    자료구조
    플로이드워셜
    최대공약수
    구간합
    동적계획법
    구현
    DP
    스택
    이분탐색
    월간코드챌린지
    큐
    트리
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[14565] 역원(Inverse) 구하기 (확장 유클리드 호제법)
상단으로

티스토리툴바