/ 最近 .rdf 追記 設定 本棚

脳log[2011-03-25~]



2011年03月25日 (金) 見えないところでの思いやりが、本当の思いやりなのだと思う。「誰にでも見える思いやり」なんてのは、思いやりではないのではないだろうか。」 たぶん最近多い ACの CMについて。この CM、いいと思うけどなあ。行動を促してるんだと思う。思うだけではダメで行動に移さなければいけない。思いは見えないけど行動すればそれは誰にでも見える。それを思いやりと(そのCMでは)呼ぶんだと。見せる必要はないけど、見えても嘘にはならないんじゃない。(こういうことは書いてもわかり合えるとは思わないのでコメントしないでここに書いてる)。目立つのを嫌って行動できない日本人は多そう。考えすぎ。それも言い訳を。子供の時にたたき込まれてたら照れもなくできるんだろうとも思う。レディファーストとか。

最終更新: 2014-04-25T14:53+0900

[ProjectEuler] Problem 81, 82, 83

 Problem 81

迷路より簡単。右下から左上に向かって、右の要素と下の要素を参照しながら順番に処理するだけ。

matrix = DATA.lines.map{|ln| ln.chomp.split(",").map(&:to_i) }
raise "正方行列でない!" if matrix.size != matrix[0].size
(matrix.size-1).downto(0){|i|
	(matrix[i].size-1).downto(0){|j|
		incr = nil
		incr = matrix[i][j+1] if j+1 < matrix[i].size
		incr = matrix[i+1][j] if i+1 < matrix.size && (!incr || matrix[i+1][j] < incr)
		matrix[i][j] += incr if incr
	}
}
p matrix[0][0]
__END__
content of matrix.txt here.

 Problem 82

まだまだ簡単。最下段から、行を右へ左へ処理しながら上へ向かうだけ。こういう、問題・入力に依存して可変長のメモリを確保したりしない、そのうえ問題を単純に走査するだけの解法は安心できる。

Matrix = DATA.lines.map{|ln| ln.chomp.split(",").map(&:to_i) }.transpose # transpose:問いの右から左が、下から上への処理になる。
Order = Matrix.size
raise "正方行列でない!" if Matrix.size != Matrix[0].size

row = Matrix[0].dup # 1-line memo. row is now at the first(top) line of Matrix.
1.upto(Order-1){|i|
	# move from up ↓↓↓↓↓↓↓↓↓↓
	0.upto(Order-1){|j|
		row[j] += Matrix[i][j]
	}

	next if i == Order-1 # 最後の行は横移動不要(※禁止ではない)。最小値だけを選び取って答えにするから。

	# move right →→→→→→→→→→
	0.upto(Order-2){|j|
		src, dst, move_cost = row[j], row[j+1], Matrix[i][j+1]
		row[j+1] = src + move_cost if src + move_cost < dst
	}

	# move left ←←←←←←←←←←
	(Order-1).downto(1){|j|
		src, dst, move_cost = row[j], row[j-1], Matrix[i][j-1]
		row[j-1] = src + move_cost if src + move_cost < dst
	}
}
p row.min
__END__
content of matrix.txt here.

Array#transposeを使う機会があるなんて思わなかった!好きなメソッドは transpose(今日だけ)。ま、使わなくてもいいんだけど線形にアクセスするために。ま、メモリ構造からは遠く離れた Rubyなんだけど。


 @2013-05-11 アップデート

N×N確保していた作業メモを 1行分だけで済ませるようにスクリプトを修正。

コメントに「transpose:問いの右から左が、下から上への処理になる。」ってあるけど、今問題文を見ると左から右になってる。まあ、どっちからどっちでも変わらないからね。問題文が左から右になったからってわけではないけど、アップデート後は上から下の処理に変えてる。下から上だと、どうしてもその必然性を探してしまうから。

 Problem 83

シリーズの締め。迷路のときとは違って 80×80ともなると手当たりしだいに探索の手を伸ばしていくと 10分以上の時間がかかる。優先度を付けると insertのコストが加わったにもかかわらず、笑っちゃうぐらい一瞬で終わった。

C++だったら queueの実装として std::multimapを使うところだけど配列をヒープ構造にするのもありだ。

Matrix = DATA.lines.map{|ln| ln.chomp.split(",").map(&:to_i).freeze }.freeze
raise "正方行列でない!" if Matrix.size != Matrix[0].size
matrix = Matrix.map{|ln| Array.new(ln.size) }
size = matrix.size
moved = lambda{|i,j, l,m|
	return false if not (0...size).include?(l) or not (0...size).include?(m)
	src, dst, move_cost = matrix[i][j], matrix[l][m], Matrix[l][m]
	return false if dst && dst < src + move_cost

	matrix[l][m] = src + move_cost
	return true
}
matrix[0][0] = Matrix[0][0]
queue = [[0,0]]
insert = lambda{|l,m|
	val = matrix[l][m]
	queue.insert(queue.index{|i,j| val <= matrix[i][j] }||queue.size, [l,m])
}
until queue.empty?
	i,j = *(queue.shift)
	break if matrix.last.last and matrix.last.last <= matrix[i][j]
	[[i-1,j],[i+1,j],[i, j-1],[i,j+1]].each{|l,m|
		if moved[i,j, l,m]
			insert[l,m]
		end
	}
end
p matrix.last.last
__END__
content of matrix.txt here.

<queue>ヘッダには priority_queueクラスがあるし、<algorithm>には make_heap, pop_heap, push_heap といった、配列(RandomAccessIteratorをそなえたコンテナ)にかぶせて使うための関数があった。そりゃあるわなあ。ソートキーが要素のみから算出できない今回の場合に priority_queueを使う(外部キー)か、multimapを使う(内部キー)かはやっぱり決めかねるけど。


2011年03月24日 (木) デマ(=デマゴギー)。デマゴーグというのは聞いたことがあるな。すっかりデマカセのデマだと思ってた。


2011年03月23日 (水) アマゾンの(本屋として)ダメなところ。1.在庫が薄い。近くの本屋になくてもアマゾンなら、なんて今は昔。昔から「在庫あり」しか信用できないが今や在庫ありは珍しい。発売直後の本が特に弱い。2.発送が遅い。幅が広すぎるうえに信用ならない発送予定日と、発送(予定)日で並び替えできない注文管理画面。宙ぶらりんでほっとかれたりトラッキングしにくかったりするのが不満の素。すぐに発送されないからこれらがあらわになる。3.邪魔な段ボール。品によっては段ボールを買ったのかと錯覚する。4.配送コスト度外視。それは合理化による利得とは違うよね。運送会社の料金表をそのまま写したような配送料を設定する販売者もアホだが(「一定金額以上お買い物をすると代引き手数料があがります」<10万円の商品と500円の商品の利益が同じなわけじゃないでしょうに。商品にお金を出すのと手数料にお金を出すのでは意味が違うんよ。それは抵抗感の違いとなって買い物のハードルを上下すると思うんだけど)、1割引のマンガをただで送るというのもどうかしてる。


2011年03月21日 (月) セキュリティホールmemo 経由で、「原発がどんなものか知ってほしい(全)」。追記@2011-03-28:「怪文書「原発がどんなものか知ってほしい」の功罪|猫惑星日誌」俺は「原発がどんなものか知ってほしい」を今回の件で初めて読んだ。現場を知る人間の言葉として真実が含まれると思って大真面目に読んだから、それを 99.9%でたらめだと断じ、最後には人間の可能性や信念に訴える「原発がどんなものか知ってほしい(妖精現実 XMLアーカイブ)」が原発推進のために、踏み台になる(限られた、自分以外の)人々の境遇に目をつぶり便利な生活を捨てられない読者を誘導するプロパガンダにみえる。立場が違えば見えるものも言うことも違う。もう一つリンク。ファインマンさんの文章を孫引き「宇宙船の故障と、それによる人命の損失の確率については、 人々の間に大きな意見の隔たりがあるようである。この見積りは およそ100分の1というものから、10万分の1というものまであった。 高い確率は現場のエンジニアからきたものであり、いっぽう非常に低い確率は NASA上層部からきたものである。これほどの不一致がおこる原因と、 それがもたらす帰結はどういったものであろうか? 10万分の1の確率といえば、 これは300年のあいだ毎日スペースシャトルを打ち上げつづけても 1回しか失敗しないということを意味する。だから私たちは こう尋かなければならない。「この宇宙船に対して、 NASA上層部がこれほどまでに絶大な信頼をおいてしまった原因は何だろうか?」と。」電力会社の上層部ってのはこうですから「91年の関西電力・美浜原発2号機の蒸気発生器細管破断事故や、95年の「もんじゅ事故」、99年の茨城県東海村の臨界事故では、原発への不安が高まった。しかし、電力会社はいずれのケースも、部品の施工ミスや設計ミスなど「想定外の事象が原因」と強調。07年の新潟県中越沖地震で東電・柏崎刈羽原発が全機停止した時も「原因は変圧器の火災。原発の設計構造そのものに問題はない」と、深刻な事故につながるリスクを否定してきた。」想定外の、決して低くない確率で起こる「事象」にそなえる気があるのやらないのやら。そういうのが積み重なって大事故につながるんでしょ。電力会社と国は原発が(許容できる程度に)安全だ不可欠だとこれからも信じさせることができるんでしょうかっ。


2011年03月20日 (日)

最終更新: 2011-03-21T02:43+0900

[ProjectEuler] Problem 76, 77, 78

 Problem 76

Problem 31と同じ問題。その解答(20110125p01.03)。ただし、Problem 31には通用した俺の解法では全然終わらない。

Target = 100
a = [1] + [0]*Target
(Target-1).downto(1){|pick|
	0.upto(Target-pick){|i|
		a[i+pick] += a[i]
	}
}
p a[Target]

 Problem 77

素数ごとに一から再試行してるけど計算量はたかがしれてた。

require 'mathn'
prime_gen = Prime.new
primes = []
prime_gen.each{|prime|
	primes.push prime

	a = [1] + [0]*prime
	primes.each{|pr|
		0.upto(prime-pr){|i|
			a[i+pr] += a[i]
		}
	}

	answer = a.index{|x| 5000 < x }
	if answer
		p answer
		exit
	end
}

 Problem 78

まったくひどい解答。76から続くシリーズの締めらしく、何も考えないと計算量が膨大になる。手続き的な解法から一歩進む必要がある。それか一分ルールを無視して何時間もかけて良しとするか。

Target = 100000
a = [1] + [0]*Target
(Target-1).downto(1){|pick|
	0.upto(Target-pick){|i|
		a[i+pick] += a[i]
	}
}
p a.index{|x| x%1_000_000 == 0}

2011年03月19日 (土) 「乗るべきか乗らないべきか」 ちょっと違和感が。文法的に説明できないし、古めかしく聞こえるけど「乗らぬべき」がしっくりくるかな(音的に)。「すべき」と「するべき」も迷う。なんとなく「すべき」にしたい。あと、最近「べき」が使われすぎてて押しつけがましさを感じる。検索>「「べき」という言葉はどう使うべきか[絵文録ことのは]2004/05/14」 べきは連体形で終止形はべしだとか。べしはもはや出てこないなあ。べきに動詞の何形が接続するのか考えたときに、せ・し・する・する・すれ・しろ(せ(よ))……「す」がない。あれ? するべき? とわき上がった疑問もあっさり解消。「現代語では、「する」という動詞がある。しかし、古典文法では、それは「す」という動詞なのだ(連体形が「する」である)。「終止形+べし」というルールに従えば、古典では「すべし」、現代文法的には「するべし」ということになる。」■■■@2014-02-12「よく見る「しないべき」とかも「するべきでない」にしてほしい。」べしの方を否定するのか。そちらの方が普通だな。そして先に書いた「ぬべき(ぬべし)」に関して、「【ぬべし】って否定? | 扶桑(ふさう)」。ぬべしのぬは完了(※リンク先では確述といってますね)のぬであった。そりゃあ音で判断すればありだったかもしれないが意味が変わってしまっていた。「乗らざるべき」はますますもって文語調なので「乗るべきか乗るべきでないか」とするのが一番自然でした。■「乗りぬべし」だったら否定だとは間違えなかった。区別がつくんだから「乗らぬべし」は否定のず(ぬ)で解釈してくれても……。■判別性を根拠にするその言に説得力がないのは、区別できなくてもらを抜かない、無理矢理可能動詞を作ったりしない人間の言うことだから。■間違いさがし。1.風立ちぬべし。2.風立たざるべし。3.「風立たぬべし」。4.「風立たないべし」。5.「風立たないべき」。4と 5から受ける印象を比べると「~いべき」を含む「~べき」は単なる間違いから一歩抜けた新しい段階にいると感じる。自分自身、「べき」の終止形が「べし」だという意識はなかったのだし(連体形だけでも文は作れる。それが最近気になり出した傾向でもあるのだけど>20140123)。


2011年03月16日 (水) 糸井さんが示した目安「じぶんひとりを3日雇えるくらいのお金」が大変参考になった。それとこちら>「@14:36」 いわゆる封筒裏の計算で、一時の熱狂が過ぎた後も継続して、収入の 1割を今後 10年間差し出す覚悟があるかと問うている。時限法案で消費税 1%上げとかいう話も聞くから、とりあえずそこを目処に続けんとダメやろね。


2011年03月15日 (火)

最終更新: 2012-02-29T17:34+0900

[ProjectEuler] Problem 72

 Problem 72

前のバージョンはここ(20110312p01.02)。step2を最適化*すると倍くらい速くなって 1分半(ウチのPC基準で。C++だとコンマ1秒)。それに伴い素因数の組み合わせを求める必要がなくなったので、100万要素の配列の配列が 100万要素の Fixnum配列になってメモリ使用量が再び数MBレベルになった。

LIMIT = 1_000_000
pfs = Array.new(LIMIT+1, 1)
count = LIMIT*(LIMIT+1)/2 - 1 # 1) 2からLIMIT以下の分母 d につき d 通りの分子を予め計上する。
2.upto(LIMIT){|d| # 0) 2からLIMIT以下の分母 d に対して、
	print d,"\r"
	d.step(LIMIT, d){|_| pfs[_] *= -d } if pfs[d] == 1
	# 2) 分子が d で分母が d の倍数になるものを加減する。
	count += pfs[d]/pfs[d].abs * (LIMIT/d)*(LIMIT/d+1)/2 if pfs[d].abs == d
}
p count

一週間後にはこのコードが理解できなくなってること請けあい。


ググった>「Dreamshire | Project Euler Problem 72 Solution」。φ関数の値を合計するとかで、Rubyでも10秒未満。Problem 69に出てきた関数だけど、その問題はインチキしたから理解してないんよね。

LIMIT = 1000000
phi = (0..LIMIT).to_a
2.upto(LIMIT){|n|
	n.step(LIMIT, n){|m|
		phi[m] *= (n-1.0)/n
	} if phi[n] == n
}
p phi.inject(&:+).floor-1

繰り返しの構造は似てるのにこの実行時間の差はなんだ? と思ったら print d,"\r" の有無だけだった。俺のも同等に速い。

* 全体でみると同じ数字を足したり引いたりを繰り返してる気がしたので個々の dに特有の値だけを加減するように。


2011年03月14日 (月) ActiveRuby.msiのアンインストーラは binフォルダに放り込んだ ruby.icoや lib/ruby/site_rubyに個人的にインストールしたライブラリを残してくれるのね。抜かりがない。時間はかかるけど。

最終更新: 2011-03-14T21:52+0900

前後の衛星写真をくらべて言葉を失った。地形がかわっとる。町がない。思い出せばリポーターは最初からこの状況を伝えようとしていた。そして、言葉からでは想像が難しかったことが衛星写真で明らかになったように、衛星写真でわかることは実際の万分の一もない。

1号機に続いて 3号機でも(建物内の水素ガスが)爆発。2号機の冷却機能喪失。原発設置のハードルがさらに上がってしまったのが残念。非現実的なコストを積み上げて想定される災害対策を行っても、心情的に無理なんじゃないか。

専門家は癌を死の病だと盲目的におそれる患者(キャスターがその役)に対するように、不安を煽らないように煽らないようにしゃべっていた。でもそれでは不信を招く。これだけ浴びたらこういう症状が出ます、という情報も知りたい。当事者には汚染の有無だけが重要で、汚染はあるんだし、避難勧告に従っていれば大丈夫っていっても、避難できなかった人が被曝して「「除染」後の検査でも高い放射線量の値を示したため、第2次被曝医療機関に搬送されていた」んだけど。


不勉強。


2011年03月13日 (日) コツ(3):「伝え返し」と「問い掛け」を駆使する」 「伝え返し」ねえ。TVドラマで頻繁にみかけるそういうのを見て、アホみたい、テンポが悪い、と思ってしまうからコミュニケーションが下手なんだろうなあ。カウンセラーの常套手段なのにね。相手の言葉を聞いて自分は納得して先に進もうとするけどその前に相手にそのシグナル(ACKていうの?)を伝えてない自覚はある。合理性や正しさが唯一絶対の価値だと信じてるきらいもある。自分の正しさを信じがちなところがまた質が悪い。(信じる⇐根拠がない)

最終更新: 2011-03-14T23:14+0900

[ProjectEuler] Problem 73, 74

 Problem 73

昨日(20110312p01)の延長。Problem 72の解答と同じ部分より違う部分を見つける方が難しい。

LIMIT = 12000
pfs = Array.new(LIMIT+1){ [] }
count = 0
2.upto(LIMIT){|d| # 0) LIMIT以下のすべての分母 d に対して、
	print d,"\r"
	d.step(LIMIT, d){|_| pfs[_] << d } if pfs[d].empty?
	n_min, n_max = d/3, (d-1)/2 # (n_min, n_max]
	next unless n_min < n_max
	count += n_max - n_min # 1) とりあえず一通りの分子を計上し、
	# 2) 8分の6など通分可能なものを差し引きする。
	(1..(pfs[d].size)).each{|r|
		cms = pfs[d].combination(r).map{|pf| pf.inject(&:*) }
		count -= (-1)**(r%2+1) * cms.map{|cm| n_max/cm - n_min/cm }.inject(&:+)
	}
}
p count

 Problem 74

問題文のヒントを最大限に利用したが数分かかる。総当たりでなく組み合わせ単位でテストしてその順列を計上したらマシになるかも。順列を考えるときに先頭の桁に 0を置くようなミスを犯しそうだがね。

factorial = [1,1] # [0!,1!,...]
factorial.push(factorial.size*factorial.last) until 9 < factorial.size

chain_length = lambda{
	memo = {
		169 => 3, 363601 => 3, 1454 => 3,
		871 => 2, 45361 => 2,
		872 => 2, 45362 => 2
	}
	f = lambda{|start|
		return memo[start] if memo.has_key?(start)
		next_ = start.to_s.chars.map{|c| factorial[c[0]-?0] }.inject(&:+)
		return memo[start] = 1 + (start == next_ ? 0 : f.call(next_))
	}
}.call

p (1...1_000_000).inject(0){|sum,n| sum += 1 if chain_length.call(n) == 60; sum }

2011年03月12日 (土) combinationメソッドを調べるために Ruby 1.8.7のドキュメントを少し読んだ(常用のリファレンスは20051129だ)。choiceから sampleへの名前変更は良かった。choiceは意思を明らかにする行為だと思うからランダム抽出とは相容れないよ(それとも神の選択か)。「Ruby 1.8.8 以降では Array#sample を使ってください。」 Ruby 1.8.8 は出るんでしょうか?

最終更新: 2011-03-15T00:15+0900

[ProjectEuler][Ruby] Problem 71, 72

 Problem 71

「HCF(n,d)=1」には用語の説明があると思ったんだけどなかった。n/dの nと dは最大公約数が 1の既約分数だとすると意味がとおるので HCF=Highest Common Factorだと決めた(でっちあげ)。

分数とはなんぞやだとか切断だとか小難しく考えてしまったが(実際には考えられるほど知らない)、ワンライナーだった。3/7より少し小さい100万個の分数を小数になおして、一番小さいものを見つける。有理数にして比較しないのは時間がかかるから。公約数をみつけたりする時間だろうか。

require 'rational'
p Rational(*(2..1_000_000).inject([0,1]){|answer,d|
	answer[0]/answer[1].to_f < (d*3-1)/7/d.to_f ? [(d*3-1)/7,d] : answer
})

 @2011-03-14 なにこれ!

Project Euler Problem #71 « KeyZero Conversation

分数を初めてならった小学生が必ず間違える分数の足し算(通分せずに分母どうし分子どうしを加算する)にこんな意味があるとか!

 Problem 72

分単位のお時間がかかります。(訳:一時間はかからないけど……)

何倍も速くなるので「Integer#prime_division」を使う代わりに 100万要素の配列を使ってる。トレードオフで使用メモリは数MBから 100MB超になるが。 小手先のチューンよりアルゴリズムを改良しろってのはもっともだけど、かなしいかな、できることとできないことがあるのです。

LIMIT = 1_000_000
pfs = Array.new(LIMIT+1){ [] }
count = 0
2.upto(LIMIT){|d| # 0) LIMIT以下のすべての分母 d に対して、
	print d,"\r"
	count += d-1 # 1) とりあえず d-1 通りの分子を計上し、
	d.step(LIMIT, d){|_| pfs[_] << d } if pfs[d].empty?
	# 2) 8分の6など通分可能なものを差し引きする。
	(1..(pfs[d].size)).each{|r|
		cms = pfs[d].combination(r).map{|pf| pf.inject(&:*) }
		count -= (-1)**(r%2+1) * cms.map{|cm| (d-1)/cm }.inject(&:+)
	}
}
p count

Ruby 1.9からバックポートされてきた(のだと思われる見覚えのないメソッド) cycle, tap, combination, permutation, productといったメソッドが便利だ。あとは自然数を無限に生成し続ける無限リストのようなものをどれだけ簡単に書けるかだ。なにかショートカットがあるのだろうか。これでは長すぎる。

Enumerable::Enumerator.new(lambda{|&block| n=0; loop{ block.call n+=1 } }, :call).each{|x| p x }

それと、block.callの部分を yieldにできないのもわかりにくい。Procと blockと lambdaの微妙な違いによるものなのだろうか。

Rubyによる他所の Project Eulerの解答をみていてこういう書き方も知ってるけど、カウンタが Floatになっちゃうのが不満。

1.upto(1/0.0){|n| p n }

あれ? Fixnumだ。Floatになるのは stepだった。

1.step(1/0.0){|n| p n } # 1.0, 2.0, 3.0,...

明示的に Fixnumの増分: 1を指定しても n は Float. この違いはなんだろう。


cycleの使い道として zipを想定していたが拒否されてしまった。

irb> [1,2,3,4,5].zip([0])
=> 1, 0], [2, nil], [3, nil], [4, nil], [5, nil
irb> [1,2,3,4,5].zip([0].cycle)
TypeError: can't convert Enumerable::Enumerator into Array
        from (irb):2:in `zip'
        from (irb):2
        from :0
irb> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]"

2011年03月11日 (金) [SakuraEditor] お宝発見。落とし穴マップ> サクラの小枝研 - メモ


2011年03月10日 (木) JR東:迷惑な座り方できません…山手線で新型座席試行へ - 毎日jp(毎日新聞)」 寝っ転がれないベンチと同じ発想なのね。人間工学が聞いてあきれる。人間が見えてないよ(骨格と筋肉ぐらいしか見てないんだろう)。人がいない空間や人が脇役の空間を創り出したいの?■■■@2013-06-20「壊れる前に…: 歩道の役割」■■■@2013-07-20「必要がなくても座りたくなる…奇抜なデザインのベンチいろいろ:らばQ

最終更新: 2011-03-12T02:24+0900

[ProjectEuler] 65, 66, 67, 68, 69

 Problem 65

分母を一番深いところから順番に計算していく。

a = ([2] + (1..33).map{|k| [1,2*k,1] }.inject(&:+)).reverse
denom, numer = *a.inject([0,1]){|nd, x| [nd[1], x*nd[1]+nd[0]] }
require 'rational'
p Rational(numer, denom).numerator.to_s.chars.inject(0){|sum,c| sum - ?0 + c[0] }

 Problem 66

xを増やしながらの総当たりで、最後に見つかった Dが答え。と思ったんだけど Dが見つかるペースがどんどこ落ちていく。一日以上かけても 969個の Dのうち 270個が残ってる。

 Problem 67

Problem 18の延長で以前解いた

 Problem 68

  1. 16桁だから 10は一回しか使わない。10は external node.
  2. 先頭の桁(外側のノードの最小値)を最大にするために、external nodeに 10,9,8,7,6を配置する。
  3. そうすると一辺の和はとりうる値の中で最小の 14。
  4. 二桁目を最大にする 6-5-3からスタートして考えよう。次は 10-3-1しかない。
  5. ってなかんじで穴埋め。

 Problem 69

前問に引き続いて、数学でもプログラミングでもなく、オラクルで。

  1. n/φ(n)を最大にするために……
  2. 分母を小さくするために、nはたくさんの素数を因数に持っている方がいい。⇒すべて異なる素数の積からなる数。
  3. 分子を大きくするために、nは上限の 100万に近い方がいい。
  4. 分子と分母のバランスの取り方は勘で。