Project Euler 69

オイラーのトーティエント関数、φ(n)[時々ファイ関数とも呼ばれる]は、nと互いに素なn未満の数の数を定める。たとえば、1、2、4、5、7、そして8はみな9未満で9と互いに素であり、φ(9)=6.

n 互いに素な数 φ(n) n/φ(n)
2 1 1 2
3 1,2 2 1.5
4 1,3 2 2
5 1,2,3,4 4 1.25
6 1,5 2 3
7 1,2,3,4,5,6 6 1.1666...
8 1,3,5,7 4 2
9 1,2,4,5,7,8 6 1.5
10 1,3,7,9 4 2.5

n ≤ 10ではn/φ(n)の最大値はn=6であることがわかる。

n ≤ 1,000,000で n/φ(n) が最大となる値を見つけよ。

#include <iostream>
using namespace std;

// オイラーのトーティエント関数
int fi(int n)
{
    int result = n;
    for(int i=2;i*i <= n;i++)
    {
     if (n % i == 0) result -= result / i;
     while (n % i == 0) n /= i;
    }
    if (n > 1) result -= result / n;
    return result;
}

int main(){
	int maxn=0;
	double tmp, maxntn=0;
	for(int i=1 ; i<1000000 ; i++){
		tmp = (double)i/(double)fi(i);

		if(maxntn < tmp){
			maxn = i;
			maxntn = tmp;
			cout << maxn << " " << maxntn << endl;
		}
	}

	cout << "->" << maxn << " " << maxntn << endl;

	int end;
	cin >> end;
}

数論系は偉大な先人の知恵を使うのが一番。こちらを参考にしました。