일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Gram matrix
- 소수
- 합성곱 신경망
- 딥러닝
- Python
- 오일러 프로젝트
- 베이지안
- 히토요시
- 수달
- deep learning
- backpropagation
- bayesian
- 역전파
- 자전거 여행
- CNN
- 신경망
- SQL
- Autoencoder
- 역전파법
- mnist
- 소인수분해
- A Neural Algorithm of Artistic Style
- 냥코 센세
- neural network
- project euler
- 전처리
- 비샤몬당
- 오토인코더
- c#
- Convolutional Neural Network
- Today
- Total
목록오일러 프로젝트 (52)
통계, IT, AI
1. 개요 문제는 이곳에서 확인할 수 있다. 3797은 재미있는 수인데, 그 자체로 소수일 뿐만 아니라 왼쪽 또는 오른쪽으로 한자리씩 지워나가도 모두 소수이다. 즉, 왼쪽으로 한자리씩 지워나갈 때 각각 379, 37, 3이 되는데 모두 소수이다. 마찬가지로 오른쪽으로 지워나갈 때 각각 797, 97, 7이되며 모두 소수이다. 이와 같은 특성을 지닌 소수를 truncatable prime이라고 하며 11개만 존재한다고 한다. truncatable prime의 합을 구하는 것이 목표이다. 단, 2, 3, 5, 7, 9는 truncatable prime가 아니다. 2. 구현 ver 1.0 에라스토테네스의 체를 사용하여 소수를 찾는다. # -*- coding: utf-8 -*- import math class ..
1. 개요 문제는 이곳에서 확인할 수 있다. 어떤 문자나 숫자의 역순이 원래의 것과 같다면 그 문자나 숫자를 palindrome이라고 한다. 585는 특이한 성질을 지니고 있는데 585와 그것의 2진수가 모두 palindrome이기 때문이다. 이와 같은 성질을 지닌 1,000,000 이하의 숫자의 합을 구하는 것이 문제의 목표이다. 2. 구현 어떤 수의 palindrome을 구하는 방법에는 여러가지가 있는데, 여기서는 나눗셈을 이용한 방법을 사용한다. 예를 들어, 115를 10으로 나누면 11의 몫과 5의 나머지가 나온다. 5에 10을 곱하여 이를 결과라고 하자. 11을 10으로 나누면 몫 1과 나머지 1이 나온다. 앞서 구한 결과에 10을 곱한 후 나머지 1에 10을 곱하여 결과에 더한 후 몫 1을 거..
1. 개요 문제는 이곳에서 확인할 수 있다. 197은 특이한 소수인데, 각 자리의 수를 순환시켜도 모두 소수이기 때문이다. 즉, 971, 719 모두 소수이다. 이와 같은 특성을 보이는 1,000,000 보다 작은 소수의 개수를 구하는 것이 목표이다. 단, 중복을 허용한다. 즉, 197, 971 그리고 719는 한가지 소수를 순환하여 만들 수 있지만 따로 센다. 2. 구현 ver 1.0 먼저 100만 이하의 소수를 에라스토테네스의 체를 이용하여 구한다. 이후 각 소수를 순환시키면서 그 수가 소수인지 확인한다. # -*- coding: utf-8 -*- import math as m # 1. Find primes lim = 1000001 prime_candidate = list(range(2, lim)) ..
1. 개요문제는 이곳에서 확인할 수 있다. 어떤 수는 각 자리의 factorial의 합으로 나타낼 수 있다. 예를 들면, \(145\)는 \(1!+4!+5!\)와 같다. 이러한 특징을 갖는 모든 수의 합을 구하는 것이 목표이다. 2. 구현 문제에 조건에 의하여 검사해야 할 숫자에는 상한선이 있다. 즉, \(n\)자리 숫자 중 가장 작은 수인 \(10^{n-1}\)이 \(n\)자리 숫자로 만들 수 있는 가장 큰 값인 \(9!n\)보다 작은 경우만 검사하면 된다. # -*- coding: utf-8 -*- import math as m n = 1 fact_9 = m.factorial(9) while 10**(n-1) < fact_9*n: n += 1 answer = 0 for i in range(10, fa..
1. 개요문제는 이곳에서 확인할 수 있다. \(49/98\)은 흥미로운 분수인데, 분자와 분모에 포함된 같은 수 9를 지우면 본래의 값과 같기 때문이다. 이와 같은 특성을 보이는 분수를 찾아 곱하고 약분한 후 분모의 값을 구하는 것이 목표이다. 단, 분자와 분모가 각각 두자리 수여야 하며 분수는 1보다 작아야 한다. 그리고 공통된 수는 0이 아니어야 한다. 이러한 특성을 보이는 분수는 4개가 있다고 한다. 2. 구현십의 자리가 \(a\), 일의 자리가 \(b\)인 어떤 두자리 수를 간략하게 \(ab\)로 나타내자. 분자와 분모에 공통적으로 포함된 같은 수를 \(d\)라고 하면 확인해야 할 분수의 형태는 \(da/db\), \(ad/db\), \(da/bd\), \(ad/bd\)의 4가지 밖에 없다. 또한..
1. 개요 문제는 이곳에서 확인할 수 있다. 7254는 39와 186의 곱으로 나타낼 수 있다. 즉 \(39 \times 186=7254\)이다. 이 수식에는 1부터 9까지의 숫자가 한번씩만 사용되었다. 7254와 같이, 1부터 9까지의 숫자를 한번씩만 사용하여 곱의 형태로 나타낼 수 있는 모든 숫자의 합을 구하는 것이 목표이다. 2. 구현 문제의 조건에 맞는 곱의 형태는 두가지 밖에 없다. 즉, 한자리 숫자와 네자리 숫자를 곱하여 네자리 숫자를 만드는 것과 두자리 숫자와 세자리 숫자를 곱하여 네자리 숫자를 만드는 경우 이외에는 문제의 조건에 맞지 않는다. 이를 이용하여 답을 구하자. # -*- coding: utf-8 -*- answer = [] # CASE 1: 1-digit multiply 4-di..
1. 개요문제는 이곳에서 확인할 수 있다. 1, 2, 5, 10, 20, 50, 100 그리고 200을 사용하여 200을 만드는 방법의 수를 구하는 것이 목표이다. 이 문제는 재귀함수를 사용하여 간단하게 해결할 수 있다. 즉, 200에서 100을 빼고 나면, 문제는 100을 만드는 방법의 수를 구하는 것으로 변한다. 2. 구현: ver 1.0재귀함수를 이용하여 구현한다. 하지만 이 방법은 그다지 효율적이진 않은데, 만약 200이 아니라 400을 구하라고 해도 생각보다 시간이 오래 걸린다. 사람들의 아이디어를 참고하여 memoization을 사용하려고 했지만 아둔하기 짝이 없어 결국 이해하지 못했다. # -*- coding: utf-8 -*- import numpy as np coins = [200, 10..
1. 개요문제는 이곳에서 확인할 수 있다. \(1634\)는 각 자리수의 4승의 합과 같다. 즉, \(1634=1^4+6^4+3^4+4^4\)이다. 이와 같이, 각 자리수의 5승의 합과 같은 모든 숫자의 합을 구하는 것이 목표이다. 단, 1은 합이 아니므로 제외한다.2. 구현: ver 1.0무한히 많은 숫자에 대해서 이를 테스트할 수는 없으므로 상한선을 찾아야 한다. \(n\)자리의 수 \(d\)가 있다고 하자. \(d\)의 최소값은 \(10^{n-1}\)이며, 최대값은 \(10^n-1\)이다. 그리고 \(d\)의 각 자리수의 5승의 합의 최대값은 \(9^5n\)이다. 따라서 \(10^{n-1}>9^5n\)를 만족하는 \(n\)부터는 확인할 필요가 없다. 사실 \(9^5\times 7=59049 \tim..
1. 개요 문제는 이곳에서 확인할 수 있다. 정수 \(a\in[2,100], b\in[2,100]\)에 대하여 \(a^b\)의 개수를 세는 것이 목표이다. 단, 중복은 제외한다. 2. 구현: ver 1.0loop를 이용하여 구현하되 overflow를 방지하기 위하여 Decimal 내장 모듈을 사용한다. # -*- coding: utf-8 -*- import decimal as d term_list = [] for a in range(2, 101): for b in range(2,101): term_list.append(d.Decimal(a) ** d.Decimal(b)) print(len(set(term_list))) 답은 9183이다.
1. 개요문제는 이곳에서 확인할 수 있다. 1부터 시계 방향으로 늘어놓은 뒤 대각선에 있는 숫자들의 합을 구할 수 있다. 아래의 예는 5행 5열의 숫자더미이며 대각선의 숫자의 합은 101이다. 1001행 1001열의 숫자더미에서 대각선의 숫자의 합을 구하는 것이 목표이다. 2. 구현: ver 1.0일반항을 구하여 문제를 해결하자. 1부터 시작하여 오른쪽에 존재하는 숫자들의 개수를 층이라고 정의하자. 예를 들면, 그림 1은 3층이다. 그러면 오른쪽 대각선의 있는 숫자는 층수 번째 홀수의 제곱임을 알 수 있고 이를 이용하여 일반항을 구할 수 있다. # -*- coding: utf-8 -*- n = 500 print(n*(8*(n+1)*(2*n+1)//3+2*n+6)+1) 답음 669171001이다.