フェルマーの最終定理の反「反例」(MPFR対応Gawk)


4904807154かつて、awk用のフェルマーの最終定理の「反例」を紹介したことがありましたが、最近のGawkでは「反例」にならないようです。

Ubuntu 16.04のGawkで試せます。

$ echo '5999856 99992800 100000000' | gawk '{print $1**3+$2**3-$3**3}'
0

$ echo '5999856 99992800 100000000' | gawk -M '{print $1**3+$2**3-$3**3}'
-2985984

Ubuntu 14.04の場合は準備が必要です。

下の方法では、管理者権限を使ってふつうにインストールしています。アンインストールする場合は、作業ディレクトリで「make uninstall」としてください。

sudo apt-get -y install texinfo libmpfr-dev libgmp-dev

git clone git://git.savannah.gnu.org/automake.git
cd automake-1.15
./configure && make && sudo make install
cd ..

git clone git://git.savannah.gnu.org/gawk.git
cd gawk
./configure && make && sudo make install
cd ..

参考:GNU AWKはまだまだ成長中! ユーザーの声をもとに作成された拡張機能を組み込んでみよう

MathematicaのFindShortestTourのバグ


先日CodeIQで、巡回セールスパースン問題を出題しました。

Mathematicaには、指定した点をすべて通る最短の巡回路を求める関数 FindShortestTour があるので、これを使えば簡単なはずでしたが、実はそこにはトラップがあったかもしれません。

追記:問題は3つありますが、Mathematica 10.4.1, 11.2で未解決なのは3番目のみです。

問題1(10.0.2 for Windowsで解決)

Mathematica 10.0.1 for Windowsでは、{{6, 2}, {4, 6}, {3, 4}, {6, 7}}という4点を通る最短巡回路を求められませんでした。

問題2(10.0 for Linux ARM (32-bit) (August 4, 2014)で解決)

10.0 for Linux ARM (32-bit) (January 29, 2014)の FindShortestTour は、仕様がマニュアルと違っていました。

pts = {{1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 1}, {2, 3}, {2, 5}, {3, 1}, {3, 2}, {3, 4}, {3, 5}, {4, 1}, {4, 3}, {4, 5}, {5, 1}, {5, 2}, {5, 3}, {5, 4}};
FindShortestTour[%]

マニュアルによれば、巡回路の最初と最後は同じ(この例では1)はずなのですが、ここで得られる結果は「{14 + 5 Sqrt[2], {1, 2, 7, 3, 4, 5, 8, 12, 11, 15, 19, 14, 18, 17, 16, 13, 9, 10, 6}}」で、仕様とは違っていました。

問題3(10.4.1, 11.2, 11.3 for Windowsで未解決)

1分待っても結果が返ってこない場合があります(Core i7-4930K)。(Wolfram/Alphaでは計算できたこともある

FindShortestTour[{{0, 0}, {1, 0}, {0, 1}, {1, 1}, {0, 536870913}}]

浮動小数点で近似値だけでも・・・と思っても、やはりダメな場合があります(カーネルが落ちます)。

FindShortestTour[{{1., 0}, {0, 1}, {6421482390570520, 4284269602932036}, {239817909316376, 7744567430237013}, {2528914430818969, 5966759469595075}}]

マニュアルでは見つけられませんでしたが、「Method -> "IntegerLinearProgramming"」を付けておくとうまくいくと、サポートから教えてもらいましたが、計算はできても結果が正しくない場合があります。(この例でオプションを外すとカーネルが落ちます。)

cities = {
 {12581820340729273, 10017935966728831},
 {12754218452664193, 14539145895971681},
 {14822745302277607, 14565274414261943},
 {11873373307008371, 9781014188323403},
 {16116822349097741, 15873203518310113},
 {12701673778654019, 11291535066125623},
 {9392560345300883, 14963106019249771},
 {11529795864075473, 17759422650313613},
 {9007199254742147, 18014398509483463},
 {9007199254742149, 18014398509483461}};
FindShortestTour[cities, Method -> "IntegerLinearProgramming"]

一部のバージョンでは、巡回路{1, 4, 7, 9, 10, 8, 5, 3, 2, 6, 1}が得られますが、正解は{1, 4, 7, 10, 9, 8, 5, 3, 2, 6, 1}です。

何も気にせず使えるようになるにはまだ時間がかかりそうです。

ドーナツを穴だけ残して食べる方法


4872594703大阪大学ショセキカプロジェクト『ドーナツを穴だけ残して食べる方法』(大阪大学出版会, 2014)(各章に参考文献リストあり・索引なし)

第1部全5章では、教員5名がドーナツの穴だけ残して食べる方法を、第2部の全7章では、教員7名がドーナツの穴に学ぶことを論じている。

私にとってのベストは大久保邦彦教授の「法律家は黒を白と言いくるめる?」で、末弘厳太郎「嘘の効用」(青空文庫にある)などの参考文献もちゃんと読みたいと思う。その一方で、ドーナツの穴とはあまり関係なさそうな話もいくつかあった。

本書は、学生が中心となって大阪大学の知を書籍化するというプロジェクトの成果物だという。書籍自体は学際的だが、個々のソリューションはそうではない。次は、各分野の英知を集めなければ解けない問題に取り組んでみてほしい。

さて、肝心のドーナツを穴だけ残して食べる方法だが、小さい虫数十匹を、ドーナツの表面を這って食べ、食べ終わったらそこにとどまるように調教すれば、その様子を見た人の中には「穴だけ残った」と思ってくれる人がいるのではないだろうか。

Unicodeのすべての文字を1回ずつ使って絵を描く


文字の並びで表現された絵は一般にアスキーアートと呼ばれます。その名前からは、使える文字がASCII文字に制限されているように思えますが、実際はそうではなく、なんでもありです。「MS Pゴシック」に含まれる文字を使うのが伝統でしょうか。

先日数えてみたように、Unicode 6.0にはGraphic Characterが109242個あります(参照:Unicodeのすべての文字を1ページで)。使える文字をここまで広げると、いわゆるアスキーアートのように文字の形を利用するのではなく、文字の濃さを利用して絵を描けます。(Graphic Charactersに印刷できない文字も含まれていることは、ここでは無視します。)

せっかくこれだけの文字があるので、それぞれの文字は1回しか使えないという制約を入れましょう。正方形のキャンバスなら、331 × 331のグリッド上に文字を並べることになります(331 x 331 = 109561は109242以上の最小の平方数)。ちょっと文字が足りないので、その分は半角スペースで補うことにします(109561 – 109242 = 319個)。

こんな絵が描けます(クリックで拡大、PDF 23MB)。

Adobe-Japan1-6のすべてのグリフを1ページで


この記事で作るもの:Adobe-Japan1-6の全23058グリフを1ページで (PDF, 5MB)

Unicodeの文字の一覧を作ったのに続いて、Adobe-Japan1-6のグリフの一覧を作ります。自分で作らなくてもAdobe-Japan1のグリフ一覧は、

しかし、自分で作れるようになっていれば、全グリフを1ページにといった、自分の好きなレイアウトの一覧表が作れます。

改訂版が出るたびに買っている奥村晴彦, 黒木裕介『LaTeX2ε美文書作成入門』(技術評論社, 第6版, 2013)にも、判型が変わった頃から“Adobe-Japan1全グリフ”が掲載されているのですが、書体が小塚明朝ではなくヒラギノ明朝なので、ここでの目的には適しません。以前書いたように、小塚明朝では区別され、ヒラギノ明朝では区別されない漢字のペアがあるので、ヒラギノ明朝では全グリフにはならないのです。『基本日本語活字見本集成』の著者の一人である小形克宏さんも、ブログで次のように書いています。

このページをより一般的なヒラギノ明朝で組むという話が出たとき、ぼくはかなり強く小塚明朝でなければ信頼性を担保できないことを主張しました。仮にヒラギノ明朝でAdobe-Japan1-5を表しても、それはヒラギノとしての実装解釈を示したにすぎず、仕様制定者の本来の意図が見えなくなってしまいます。Adobe-Japan1は文字コード規格ではなく、あくまでも「グリフ」セットなのですから、小塚明朝のタイプフェイス・デザインを前提とするのは自明の理であり、その意味で小塚明朝で掲載されたことは至極当然と言えるでしょう。『基本日本語活字見本集成本OpenType版』のこと (1)

というわけで、小塚明朝で作ります。

小塚明朝とTeXLiveがインストールされた環境で、「kanji-config-updmap kozuka-pr6n」として小塚明朝を埋め込めるようにします。Adobe-Japan1-6のCIDは、0から23057まで、間を空けずに使われているようなので、単純な繰り返しをするTeXファイルで一覧を作れます。こうして作った一覧表が冒頭のPDFファイルです(改行の制御に不満があります@doraTeXさんのコードを参考に修正しました)。