페리 수열(farey sequence)
DESCRIPTION
페리 수열(farey sequence) 특징을 알아보고 관련된 project euler 문제 71, 72, 73을 풀어본다. 풀이 소스 코드를 제거하고 올림. (project euler에서 풀이를 공유하는 건 권장하지 않기 때문)TRANSCRIPT
페리 수열 / farey sequence
𝐹𝑝𝑟𝑒𝑠𝑒𝑛𝑡𝑖𝑜𝑛 =0
1,1
2,… ,
페리
farey,
수열
sequence, … ,
ohye
ohyecloudy,cloudy
.com,… ,
0 + 1
1 + 2
ohyecloudy / ohyecloudy.com
2013-06-08
페리 수열 특징을 알아본다.
• + 관련된 Project Euler 문제 풀이
• 물론 Clojure로
페리 수열?
페리 수열 𝐹𝑛은 0 ≤ ℎ ≤ 𝑘 ≤ 𝑛 , gcd ℎ, 𝑘 = 1을
만족하는 ℎ
𝑘를 오름차순으로 나열한 수열
페리 수열 𝐹𝑛은 0 ≤ ℎ ≤ 𝑘 ≤ 𝑛 , gcd ℎ, 𝑘 = 1을
만족하는 ℎ
𝑘를 오름차순으로 나열한 수열
기약분수irreducible fraction
진분수proper fraction
𝐹1 =0
1,1
1
𝐹2 =0
1,1
2,1
1
𝐹3 =0
1,1
3,1
2,2
3,1
1
𝐹4 =0
1,1
4,1
3,1
2,2
3,3
4,1
1
⋯
어떤 특징을 가진 수열일까?
• 기본적인 3가지 특징만 소개
• 문제 풀면서 추가로~
𝐹𝑞에서
𝑎
𝑏<𝑝
𝑞<𝑐
𝑑인 𝑝
𝑞는 𝑎+𝑐
𝑏+𝑑로 구할 수 있다
1
𝐹𝑞에서
𝑎
𝑏<𝑝
𝑞<𝑐
𝑑인 𝑝
𝑞는 𝑎+𝑐
𝑏+𝑑로 구할 수 있다
1
알고 있는 항member
𝐹𝑞에서
𝑎
𝑏<𝑝
𝑞<𝑐
𝑑인 𝑝
𝑞는 𝑎+𝑐
𝑏+𝑑로 구할 수 있다
1
새롭게 추가되는 항
이상하게 더하고 있어.
1
3+1
2=2
5
• 패기 넘치는 분수 더하기
• 바보 셈freshman sum
• mediant
𝐹1 =0
1,1
1
𝐹2 =0
1,1
2,1
1
𝐹3 =0
1,1
3,1
2,2
3,1
1
⋯
0 + 1
1 + 1=1
2
0 + 1
1 + 2=1
3
1 + 1
2 + 1=2
3
𝐹𝑛은 𝐹𝑛−1을 포함한다.
2
𝐹1 =0
1,1
1
𝐹2 =0
1,1
2,1
1
𝐹3 =0
1,1
3,1
2,2
3,1
1
𝐹4 =0
1,1
4,1
3,1
2,2
3,3
4,1
1
⋯
𝐹1 =0
1,1
1
𝐹2 =0
1,1
2,1
1
𝐹3 =0
1,1
3,1
2,2
3,1
1
𝐹4 =0
1,1
4,1
3,1
2,2
3,3
4,1
1
⋯
𝑎+𝑐
𝑏+𝑑는 𝐹𝑏+𝑑에서 처음으로 나타난다.
3
𝑎+𝑐
𝑏+𝑑는 𝐹𝑏+𝑑에서 처음으로 나타난다.
3
분모와 같다
𝐹1 =0
1,1
1
𝐹2 =0
1,1
2,1
1
𝐹3 =0
1,1
3,1
2,2
3,1
1
𝐹4 =0
1,1
4,1
3,1
2,2
3,3
4,1
1
⋯
기본적인 특징들
•𝑎
𝑏<𝑝
𝑞<𝑐
𝑑인 𝑝
𝑞=𝑎+𝑐
𝑏+𝑑
• 𝐹𝑛은 𝐹𝑛−1을 포함
•𝑎+𝑐
𝑏+𝑑는 𝐹𝑏+𝑑에서 처음으로 나타남
이제 문제 풀이
• + 풀이에 필요한 추가적인 특징 설명
Consider the fraction, 𝑛 𝑑 , where 𝑛 and 𝑑 are positive integers. If 𝑛 < 𝑑 and HCF 𝑛, 𝑑 = 1, it is called a reduced proper fraction.
If we list the set of reduced proper fractions for 𝑑 ≤ 8 in ascending order of size, we get:
18 ,17 ,16 ,15 ,14 ,27 ,13 ,38 ,25 ,37 ,12 ,47 ,35 ,58 ,23 ,57 ,34 ,45 ,56 ,67 ,78
It can be seen that 2 5 is the fraction immediately to the left of 3 7 .
By listing the set of reduced proper fractions for 𝑑 ≤ 1,000,000 in ascending order of size, find the numerator of the fraction immediately to the left of 3 7 .
http://projecteuler.net/problem=71
Pro
ject E
ule
r #71
𝐹1,000,000에서 3
7보다 작은 수 중 가장 큰 수를 구하라.
𝐹8 = ⋯ ,25 ,37 ,⋯
𝐹12 = ⋯ ,25 ,512 ,37 ,⋯
𝐹19 = ⋯ ,512 ,819 ,37 ,⋯
…
𝐹1,000,000 = ⋯ , 𝑥,37 ,⋯
계산 필요 없다
(defn rhs-farey-pair [[a b c d]]
(let [mediant-n (+ a c)
mediant-d (+ b d)]
[mediant-n mediant-d c d]))
(rhs-farey-pair [2 5 3 7])
[5 12 3 7]
25 ,37
512 ,37
Consider the fraction, 𝑛 𝑑 , where 𝑛 and 𝑑 are positive integers. If 𝑛 < 𝑑 and HCF 𝑛, 𝑑 = 1, it is called a reduced proper fraction.
If we list the set of reduced proper fractions for 𝑑 ≤ 8 in ascending order of size, we get:
18 ,17 ,16 ,15 ,14 ,27 ,13 ,38 ,25 ,37 ,12 ,47 ,35 ,58 ,23 ,57 ,34 ,45 ,56 ,67 ,78
It can be seen that there are 3 fractions between 1 3 and 1 2 .
How many fractions lie between 1 3 and 1 2 in the sorted set of reduced proper fractions for 𝑑 ≤ 12,000?
http://projecteuler.net/problem=73
Pro
ject E
ule
r #73
𝐹12,000에서 1
3보다 크고
1
2보다 작은 항의 개수를
구하라.
𝐹12,000을 구하려면 𝐹11,999을 구해야 한다.
뒤에 붙는 형식이 아니라 중간중간 삽입 stack overflow 냄새
바로 다음 항을 구할 수 있나?
• 𝑛이 주어졌을 때.
𝐹12,000 =01 ,112,000 , 𝑥,⋯
이 두 항은 알 수 있다.
항상 0 1 ,1𝑛
𝑎
𝑏<𝑐
𝑑<𝑝
𝑞
즉, 이 두 항으로 다음 항을 구하는 방법
𝑎
𝑏<𝑐
𝑑=𝑎 + 𝑞
𝑏 + 𝑞<𝑝
𝑞
𝒌𝑐
𝒌𝑑=𝑎+𝑝
𝑏+𝑞를 만족하는 𝒌가 존재
𝑐
𝑑는 기약분수이기 때문
𝑝
𝑞=𝑘𝑐 − 𝑎
𝑘𝑑 − 𝑏
𝒌𝑐
𝒌𝑑=𝑎 + 𝑝
𝑏 + 𝑞
𝑛
max (𝑘) =𝑛 + 𝑏
𝑑
𝑘𝑑 − 𝑏 ≤ 𝑛
𝑘 ≤𝑛 + 𝑏
𝑑
𝐹𝑛 =…,𝑎
𝑏,𝑐
𝑑,𝑘𝑐−𝑎
𝑘𝑑−𝑏,…
𝑘 =𝑛 + 𝑏
𝑑
𝐹4 =0
1,1
4,1
3,1
2, 𝑥, …
𝑎
𝑏=1
3,𝑐
𝑑=1
2, 𝑘 =
4+3
2= 3
𝑝
𝑞=2
3
(defn next-term [[a b c d n]]
(let [k (int (/ (+ n b) d))
p (- (* k c) a)
q (- (* k d) b)]
[c d p q n]))
(next-term [1 3 1 2 4])
[1 2 2 3 4]
1
3,1
2 1
2,2
3
(defn farey-seq [n]
(take-while
#(<= % 1)
(map (fn [[a b _ _ _]] (/ a b))
(iterate next-term [0 1 1 n n]))))
𝐹2 =
0
1,1
2,1
1, 3
2,2
1, ⋯
진분수 가분수improper fraction
Consider the fraction, 𝑛 𝑑 , where 𝑛 and 𝑑 are positive integers. If 𝑛 < 𝑑 and HCF 𝑛, 𝑑 = 1, it is called a reduced proper fraction.
If we list the set of reduced proper fractions for 𝑑 ≤ 8 in ascending order of size, we get:
18 ,17 ,16 ,15 ,14 ,27 ,13 ,38 ,25 ,37 ,12 ,47 ,35 ,58 ,23 ,57 ,34 ,45 ,56 ,67 ,78
It can be seen that there are 21 elements in this set.
How many elements would be contained in the set of reduced proper fractions for 𝑑 ≤ 1,000,000?
http://projecteuler.net/problem=72
Pro
ject E
ule
r #72
|𝐹1,000,000| − 2를 구하라.
0
1,1
1 제외
|𝐹1,000,000| − 2를 구하라.
𝐹1,000,000을 구해서 개수를 센다면
• 세월아 네월아.
• 개수만 빠르게 구할 수 있을까?
𝐹𝑛에서는 𝐹𝑛−1에 없는 어떤 항이 추가되나?
gcd 𝑛, 𝑎 = 1을 만족하는 𝑎
𝑛 가 추가
𝐹𝑛 = 𝐹𝑛−1 + 𝜑(𝑛)
Euler's totient function 1 ≤ 𝑘 ≤ 𝑛, gcd 𝑛, 𝑘 = 1을 만족하는 정수 𝑘 개수
𝐹𝑛 = 1 + 𝜑(𝑚)
𝑛
𝑚=1
𝐹1 = 2이고 𝜑 1 = 1이기 때문
𝜑 𝑛 = 𝑛 (1 −1
𝑝)
𝑝|𝑛
𝑛을 나머지 없이 나누는 소수prime
𝜑 2 = 𝜑 21 = 2 1 −1
2= 1
𝜑 3 = 𝜑 31 = 3 1 −1
3= 2
𝜑 4 = 𝜑 22 = 4 1 −1
2= 2
𝜑 36 = 𝜑 2232 = 36 1 −1
21 −1
3= 12
(defn euler-totient [n]
(* n
(apply
*
(map #(- 1 (/ 1 %))
(filter
#(zero? (mod n %))
(take-while #(<= % n) primes))))))
(defn farey-seq-length [n]
(+ 1
(apply +
(map euler-totient
(range 1 (inc n))))))
마무리
• 페리 수열 𝐹𝑛은 0 ≤ ℎ ≤ 𝑘 ≤ 𝑛 , gcd ℎ, 𝑘 = 1
을 만족하는 ℎ
𝑘를 오름차순으로 나열한 수열.
• 바보 셈으로 다음 항을 구하는 재미있는 특징.
• Project Euler 문제는 어떤 수열에 관련된 문제인지 안 가르쳐 줘
CC BY-NC-SA 3.0
Reference Farey sequence – wikipedia 페리 수열 – wikipedia mediant – wikipedia 바보 셈에서 페리수열로 – 네이버캐스트
@ohyecloudy