
- YouTube
www.youtube.com
애너그램(Anagram)은 원래 단어나 문구의 문자를 재배열하여 새로운 단어나 문구를 만드는 것을 말합니다. "Listen"과 "Silent", "Eleven plus two"와 "Twelve plus one" 등 문자의 재배열을 통해 새로운 의미를 창출하는 매력적인 언어적 특성을 보여줍니다. 가장 유명한 예로는 해리 포터 시리즈에서 나오는 에너그램으로 '톰 마볼로 리들(Tom Marvolo Riddle)'의 이름을 재배열하면 '나는 볼드모트 경(I am Lord Voldemort)'이라는 문구가 되는게 유명하지요.(요새는 LE SSERAFIM
순환수(cyclic number)
순환수는 애너그램과 같이 그 자릿수의 순환 순열이 숫자 자신의 정수배가 되는 정수를 말합니다. 가장 유명한 순환수인
이 수에
일반적인 증명보다 왜 이러한 현상이 일어나는지 나눗셈으로 먼저 알아보겠습니다.

여기서 중요한 점은,

이것은 왜 우리가 같은 여섯 자리 숫자를 얻지만 다른 순서로 배열되어 있는지를 자명하게 설명해줍니다. 중요한건 순환마디의 수들이 아니라 나눗셈을 할 때 생기는 나머지들이죠. 분모가
cyclic primes
그렇다면 이러한 배열은
모든 유리수는 소수로 표현할 때, 반복되거나 끝나는 성질을 가지고 있습니다. 예를 들어,
이 둘을 분류할 때 후자처럼 끝나는 경우는 오직 분수
하지만, 이 수들을 두 부분으로 나누어 보면 앞서 본 것과 같이 숫자가 재배열 됩니다. 그리고 정확하게
여기서 잠깐, 순환마디의 길이는
아마 여기까지만 보신다면 이러한 성질이
에서의 순환마디
import numpy as np
def find_primes(limit):
is_prime = np.ones(limit + 1, dtype=bool)
is_prime[:2] = False
for n in range(2, int(limit**0.5) + 1):
if is_prime[n]:
is_prime[n * n : limit + 1 : n] = False
return np.nonzero(is_prime)[0]
def to_decimal(numerator, denominator):
remainders = np.zeros(denominator, dtype=int)
decimal = ""
remainder = numerator % denominator
position = 1
while remainder and not remainders[remainder]:
remainders[remainder] = position
remainder *= 10
decimal += str(remainder // denominator)
remainder %= denominator
position += 1
if remainders[remainder]:
start = remainders[remainder]
decimal = decimal[: start - 1] + "(" + decimal[start - 1 :] + ")"
return "0." + decimal if decimal else "0"
def find_patterns(prime):
patterns = {}
for k in range(1, prime):
decimal = to_decimal(k, prime)
part = decimal.split("(")[1][:-1] if "(" in decimal else ""
if part and part not in patterns.values():
patterns[k] = part
return patterns
def to_md(limit, filename):
primes = find_primes(limit)
output = ""
for prime in primes:
patterns = find_patterns(prime)
output += f"## Prime: {prime}\n"
for k in sorted(patterns.keys()):
output += f"- **{k}**: {patterns[k]}\n"
classes = {}
unique = set()
for k, pattern in patterns.items():
rotations = {
"".join(pattern[i:] + pattern[:i]) for i in range(len(pattern))
}
key = frozenset(rotations)
if key not in unique:
unique.add(key)
classes[key] = {k}
else:
classes[key].add(k)
for key, ks in classes.items():
members = sorted(list(ks))
pattern = patterns[members[0]]
output += f"\n- **Class ({', '.join(map(str, members))})**: {pattern}\n"
output += "\n"
with open(filename, "w", encoding="utf-8") as file:
file.write(output)
to_md(1000, "cyclic_patterns_short.md")
까지의 순환주기 모음
왜 순환할까?
이러한 성질이 우연이 아니라면 증명해볼 수 있지 않을까요? 사실 순환하는 이유는 이미 나눗셈에서 보았습니다. 증명은 나눗셈을 수학적으로 다시 적는 것 뿐이죠.[^2]
여기서
따라서
이때 나오는
결국
만약
각각의 순서에 따라 소수가 순환하는 것을 알 수 있습니다.
대칭성
우리는 앞선 예시에서 한 가지 성질을 더 볼 수 있습니다. 표를 자세히 보면 순환하는 숫자들은 대칭성을 가집니다.
이것 또한 우연일까요?
여기서 우리는 모두
따라서
같은 방법으로 만약 순환마디의 길이가 홀수라면 다른 배열과 쌍대칭을 이루게 됩니다.
우리는 숫자가 단순한 수치를 넘어서 애너그램과 같이 자유롭게 변화하고 숨겨진 의미를 담을 수 있다는 것을 발견했습니다. 숫자들은 단순히 계산을 위한 도구가 아니라, 그 자체로 하나의 아름다운 대칭을 만들죠. 여러분들도 무심코 지나치는 다양한 패턴에서 더 깊은 의미를 찾아보시는 것은 어떨까요?
[^1]: The Alluring Lore of Cyclic Numbers
[^2]: Some Properties of Pure Recurring Decimals
You know what's cooler than magic? Math.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!