import time
from pyhwpx import Hwp
def insert_eq(hwp, script):
"""
hwp: Hwp 객체
script: 한글 수식 입력기 문법에 맞춘 문자열
"""
pset = hwp.HParameterSet.HEqEdit
# 수식 입력 준비
hwp.HAction.GetDefault("EquationCreate", pset.HSet)
pset.EqFontName = "HancomEQN"
pset.string = script
pset.BaseUnit = hwp.PointToHwpUnit(10.0)
# 수식 삽입 실행
hwp.HAction.Execute("EquationCreate", pset.HSet)
# 커서를 수식 우측으로 이동
hwp.Run("MoveRight")
# 1. HWP 실행 및 새 문서 열기 (실행되어있는 한글이 없는 경우)
# hwp = Hwp(visible=True)
# 또는 실행되어있는 한글에 연결
hwp = Hwp()
# 2. 제목 입력
hwp.insert_text("오일러 정리와 그 증명\r\n\r\n")
# 3. 오일러 정리 소개
hwp.insert_text("오일러 정리는 정수론에서 합동식과 관련하여 매우 유용하게 사용되는 정리입니다. 이는 페르마의 소정리를 일반화한 것입니다.\r\n\r\n")
hwp.insert_text("정리의 내용은 다음과 같습니다:\r\n")
hwp.insert_text("서로소인 두 자연수 ")
insert_eq(hwp, "a")
hwp.insert_text("와 ")
insert_eq(hwp, "n")
hwp.insert_text("에 대하여 다음이 성립합니다.\r\n")
insert_eq(hwp, "a^{phi(n)} EQUIV 1 ~(mod~n)")
hwp.insert_text("\r\n여기서 ")
insert_eq(hwp, "phi(n)")
hwp.insert_text("은 오일러 피 함수(Euler's totient function)를 의미합니다.\r\n\r\n")
# 4. 증명에 필요한 개념 정의
hwp.insert_text("증명을 위한 주요 개념\r\n")
hwp.insert_text("1) 오일러 피 함수 (")
insert_eq(hwp, "phi")
hwp.insert_text(" 함수)\r\n")
insert_eq(hwp, "phi(n)")
hwp.insert_text("은 ")
insert_eq(hwp, "1")
hwp.insert_text("부터 ")
insert_eq(hwp, "n")
hwp.insert_text("까지의 자연수 중에서 ")
insert_eq(hwp, "n")
hwp.insert_text("과 서로소인 수의 개수를 나타냅니다.\r\n")
hwp.insert_text("예를 들어, ")
insert_eq(hwp, "n=10")
hwp.insert_text("일 때, ")
insert_eq(hwp, "10")
hwp.insert_text("과 서로소인 수는 ")
insert_eq(hwp, "1,``3,``7,``9")
hwp.insert_text("의 ")
insert_eq(hwp, "4")
hwp.insert_text("개이므로 ")
insert_eq(hwp, "phi(10)=4")
hwp.insert_text("입니다.\r\n\r\n")
hwp.insert_text("2) 기약 잉여계 (Reduced Residue System)\r\n")
hwp.insert_text("자연수 ")
insert_eq(hwp, "n")
hwp.insert_text("에 대하여, ")
insert_eq(hwp, "n")
hwp.insert_text("과 서로소이고 ")
insert_eq(hwp, "n")
hwp.insert_text("보다 작은 양의 정수들의 집합을 기약 잉여계라고 합니다.\r\n\r\n")
# 5. 오일러 정리의 엄밀한 증명
hwp.insert_text("오일러 정리의 엄밀한 증명\r\n")
# 5-1. 기약 잉여계 정의
hwp.insert_text("1. 자연수 ")
insert_eq(hwp, "n>1")
hwp.insert_text("에 대한 기약 잉여계를 집합 ")
insert_eq(hwp, "R")
hwp.insert_text("이라 정의합시다. 이 집합의 원소 개수는 ")
insert_eq(hwp, "phi(n)")
hwp.insert_text("개 입니다.\r\n")
insert_eq(hwp, "R = left{ r_{1},`` r_{2},`` ...,`` r_{phi(n)} right}")
hwp.insert_text("\r\n여기서 각 원소 ")
insert_eq(hwp, "r_{i}")
hwp.insert_text("는 ")
insert_eq(hwp, "1 LEQ r_{i} < n")
hwp.insert_text(" 이고 ")
insert_eq(hwp, "gcd(r_{i}, n) = 1")
hwp.insert_text("을 만족합니다.\r\n\r\n")
# 5-2. 새로운 집합 구성
hwp.insert_text("2. ")
insert_eq(hwp, "gcd(a,n)=1")
hwp.insert_text("인 정수 ")
insert_eq(hwp, "a")
hwp.insert_text("를 집합 ")
insert_eq(hwp, "R")
hwp.insert_text("의 모든 원소에 곱하여 새로운 집합 ")
insert_eq(hwp, "S")
hwp.insert_text("를 만듭니다.\r\n")
insert_eq(hwp, "S = left{ ar_{1},`` ar_{2},`` ...,`` ar_{phi(n)} right}")
hwp.insert_text("\r\n\r\n")
# 5-3. 집합 S의 성질 증명
hwp.insert_text("3. 집합 ")
insert_eq(hwp, "S")
hwp.insert_text("의 원소들을 법 ")
insert_eq(hwp, "n")
hwp.insert_text("에 대해 살펴보면, 집합 ")
insert_eq(hwp, "R")
hwp.insert_text("의 원소들과 같습니다.\r\n")
hwp.insert_text(" (i) 집합 ")
insert_eq(hwp, "S")
hwp.insert_text("의 모든 원소는 ")
insert_eq(hwp, "n")
hwp.insert_text("과 서로소입니다.\r\n")
hwp.insert_text(" -> ")
insert_eq(hwp, "gcd(a,n)=1")
hwp.insert_text("이고 ")
insert_eq(hwp, "gcd(r_{i},n)=1")
hwp.insert_text("이므로, ")
insert_eq(hwp, "gcd(ar_{i},n)=1")
hwp.insert_text("이 성립합니다.\r\n")
hwp.insert_text(" (ii) 집합 ")
insert_eq(hwp, "S")
hwp.insert_text("의 모든 원소는 법 ")
insert_eq(hwp, "n")
hwp.insert_text("에 대해 서로 다릅니다.\r\n")
hwp.insert_text(" -> 만약 ")
insert_eq(hwp, "ar_{i} EQUIV ar_{j}~(mod~n)")
hwp.insert_text(" (단, ")
insert_eq(hwp, "i != j")
hwp.insert_text(") 이라고 가정해봅시다. ")
insert_eq(hwp, "gcd(a,n)=1")
hwp.insert_text("이므로, 양변에서 ")
insert_eq(hwp, "a")
hwp.insert_text("를 소거할 수 있습니다. 그러면 ")
insert_eq(hwp, "r_{i} EQUIV r_{j}~(mod~n)")
hwp.insert_text("가 되어, ")
insert_eq(hwp, "R")
hwp.insert_text("의 원소들이 서로 다르다는 사실에 모순됩니다. 따라서 ")
insert_eq(hwp, "S")
hwp.insert_text("의 원소들은 모두 법 ")
insert_eq(hwp, "n")
hwp.insert_text("에 대해 다릅니다.\r\n\r\n")
# 5-4. 원소들의 곱 비교
hwp.insert_text("4. 위의 두 성질에 의해, 집합 ")
insert_eq(hwp, "S")
hwp.insert_text("의 원소들을 ")
insert_eq(hwp, "n")
hwp.insert_text("으로 나눈 나머지들의 집합은 집합 ")
insert_eq(hwp, "R")
hwp.insert_text("과 정확히 일치합니다. 따라서 두 집합의 모든 원소를 곱한 결과는 법 ")
insert_eq(hwp, "n")
hwp.insert_text("에 대해 합동입니다.\r\n")
insert_eq(hwp, "(ar_{1})(ar_{2})...(ar_{phi(n)}) EQUIV r_{1}r_{2}...r_{phi(n)} ~(mod~n)")
hwp.insert_text("\r\n수식을 정리하면 다음과 같습니다.\r\n")
insert_eq(hwp, "PROD_{i=1}^{phi(n)} (ar_{i}) EQUIV PROD_{i=1}^{phi(n)} r_{i} ~(mod~n)")
hwp.insert_text("\r\n좌변을 ")
insert_eq(hwp, "a")
hwp.insert_text("에 대해 묶으면,\r\n")
insert_eq(hwp, "a^{phi(n)} (PROD_{i=1}^{phi(n)} r_{i}) EQUIV PROD_{i=1}^{phi(n)} r_{i} ~(mod~n)")
hwp.insert_text("\r\n\r\n")
# 5-5. 최종 증명
hwp.insert_text("5. ")
insert_eq(hwp, "P = PROD_{i=1}^{phi(n)} r_{i}")
hwp.insert_text("라고 둡시다. ")
insert_eq(hwp, "R")
hwp.insert_text("의 모든 원소 ")
insert_eq(hwp, "r_i")
hwp.insert_text("는 ")
insert_eq(hwp, "n")
hwp.insert_text("과 서로소이므로, 그 곱인 ")
insert_eq(hwp, "P")
hwp.insert_text(" 또한 ")
insert_eq(hwp, "n")
hwp.insert_text("과 서로소입니다 (")
insert_eq(hwp, "gcd(P,n)=1")
hwp.insert_text(").\r\n")
hwp.insert_text("따라서, 합동식 ")
insert_eq(hwp, "a^{phi(n)} P EQUIV P ~(mod~n)")
hwp.insert_text("의 양변에서 ")
insert_eq(hwp, "P")
hwp.insert_text("를 소거할 수 있습니다.\r\n")
hwp.insert_text("결론적으로 다음을 얻습니다.\r\n")
insert_eq(hwp, "a^{phi(n)} EQUIV 1 ~(mod~n)")
hwp.insert_text("\r\n\r\n이것으로 오일러 정리가 증명되었습니다.\r\n")
print("HWP 문서 생성이 완료되었습니다.")
사용방법
hwp.insert_text()는 라이브러리 자체 함수로 일반 텍스트를 넣을때 쓰는 함수임.
insert_eq()는 o3가 만든 커스텀 함수로 수식을 넣을때 쓰는 함수임. 안에 들어가는 변수값은 수식입력기에 넣는 스크립트임.
저 코드를 인공지능에 던져주고, hwp에 입력할 코드로 변환해 달라고 하면 됨.
댓글 0