본문바로가기
[오일러 프로젝트] 수은파 - 수학자들의 은밀한 파티: 10000 이하 모든 친화수의 합은 얼마일까?
수학동아 2020.09.28 21:07

 

코.알.못 홍 기자의 코딩 도전기

코딩의 ‘코’자도 모르는 코.알.못. 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제를 하나하나 해결해 나갈 예정입니다. 오일러 프로젝트는 수학과 프로그래밍 실력을 모두 키울 수 있도록 2001년에 만든 수학 문제 웹사이트입니다. 홍 기자와 함께한다면 수학과 파이썬 모두 정복할 수 있지 않을까요?

 

 

쉿! 시대를 넘어 레온하르트 오일러, 피에르 드 페르마, 르네 데카르트 세 수학자가 은밀하게 모였습니다.

수학자가 아니라 낄 수 없었던 저, 홍아름 기자가 몰래 엿보고 왔는데요,

글쎄 ‘친화수’라는 걸 두고 소곤소곤 대며 얘기를 하고 있더라고요.

도원결의처럼 우정을 다지려고 모인 걸까요?

 

 

<오일러 프로젝트 21번>

자연수 n의 약수 중 n을 제외한 약수들의 합을 d(n)이라고 했을 때,

서로 다른 자연수 a, bd(a)=b, d(b)=a를 만족하면

a, b는 친화쌍이라 하고 각각을 친화수(우애수)라고 합니다.

그렇다면 10000 이하의 모든 친화수의 합은 얼마일까요?

 

고대 그리스의 수학자 피타고라스와 그를 따르는 학파에서 시작한 친화수는 17세기 프랑스 수학자 피에르 드 페르마와 르네 데카르트, 그리고 레온하르트 오일러 등 많은 수학자가 다뤘습니다. 오일러 프로젝트 21번 문제를 풀어보며 이 수학자들처럼 수를 진득하게 들여다볼까요?

 

 

파이썬 완전정복! '약수 찾아 친화수 판별하기'

 

1. 자연수 n의 진약수의 합 구하기

두 수가 친화수인지 판별하기 위해 먼저 약수의 합을 구해야 합니다. n의 약수를 찾기 위해 n 이하의 자연수로 n을 일일이 나눠봐야 한다고 생각했나요? 60의 약수를 보면 2×30, 3×20처럼 모든 약수가 짝을 이뤄 나타난답니다. 따라서 모든 수를 나눠볼 것 없이 n 보다 작은 수로 n을 나눠보면 되죠. 그리고 n을 나눠떨어지게 하는 약수들을 모두 찾아 더하면 되는데요, 이 작업을 하는 함수 sum_factors(n)을 만듭니다. 이때 약수들의 합은 변수 s, 그리고 n을 나눌 n 과 작거나 같은 수를 변수 i로 둡니다.

 

 

2. 친화수 찾기

약수의 합을 구하는 함수 sum_factors(n)을 만들었으니, 이번엔 sum_factors(a)=b, sum_factors(b)=a가 성립하는 10000 이하의 친화수 a, b를 찾습니다. 여기서 주의할 점은 자기 자신과 진약수의 합이 같은 ‘완전수’를 제외해야 한다는 겁니다. 따라서 ab가 같은 완전수인지 확인하면서 친화수를 찾습니다.

 

 

 

도전! 오일러 프로젝트 21번 문제 뽀개기

* 코딩 언어는 Python으로 두고 실행하세요!

 

 

#1~8 자연수 n의 진약수의 합을 구하는 함수 sum_factors(n)을 정의합니다.

#9~15 sum_factors(n) 함수를 이용해 10000 이하의 친화수를 찾는 함수 e021_1(n=10000)을 정의합니다.

#16 e021_1 함수를 실행해 10000 이하의 모든 친화수의 합을 출력합니다.

 

 

Bonus! 오일러 퀴즈

오일러 프로젝트 21번 문제를 위 코딩창에서 풀어보고, 다음 예제 문제에도 도전해보세요!

 

① 100000 이하 모든 친화수의 합은 얼마인지 구해보자.

Hint. ‘def e021_1(n=10000):’에서 n의 값을 바꿔 대입해보자.

 

② 10000 이하 모든 완전수의 합은 얼마인지 구해보자.

Hint. 어떤 자연수 n의 진약수의 합이 n과 같을 때 n을 완전수라고 한다. ‘if a != b and sum_factors(b) == a:’의 조건을 완전수의 조건으로 바꿔보자.

 

 

실제로 친화수는 소설 ‘박사가 사랑한 수식’에 등장한 것으로 유명합니다.

세상의 모든 것을 수로 따져 바라보던 박사는

주변 등장인물과 자신 사이에 친화수가 있어 인연이라고 생각하지요.

이번만큼은 코딩으로 문제를 푸는 것에서 그치지 않고,

잠깐 소설 속 박사가 되어 주변에서 친화수를 한 번 찾아보는 건 어떨까요?

 

 

  •  
    MintJumper Lv.1 2020.09.29 16:46

    혹시 다음 오일러 프로젝트 문제가 정해지지 않았다면

    200번 문제 : 문자열 "200"을 포함하는 200번째 소수방어 스쿠브

    이거 가능한가요?

    댓글 작성하기 좋아요1 댓글수1
    •  
      홍아름 기자 Lv.2 2020.10.12 16:45

       

      넵! 가능하다면 수학동아 12월호에서 한 번 다뤄보도록 할게요오~~

       

      좋아요0
  •  
    Sagan Lv.4 2020.10.09 22:27 비밀댓글
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수1
    •  
      홍아름 기자 Lv.2 2020.10.12 16:45

       

      우와 엘리스코딩은 뭐예요? 저랑 함께 오일러 프로젝트 문제 풀어요오~~

       

      좋아요1
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911