MathematicaのSolveとReduceのバグ(10.2で修正)


10.2で修正されました。

Mathematica 10, 10.1のSolveとReduceには,ベクトルや行列が等しくないという条件を正しく扱えないという,かなり深刻なバグがあります。(製造元には報告済みです。)

例として,
x^2+y^2 == 1かつy == 1/Sqrt[2]
という方程式を
{x, y} != {-1/Sqrt[2], 1/Sqrt[2]}
という条件のもとで解きます。

Solve[And[
  x^2 + y^2 == 1,
  y == 1/Sqrt[2],
  {x, y} != {-1/Sqrt[2], 1/Sqrt[2]}],
 {x, y}]

Mathematica 9.0.1では
{x -> 1/Sqrt[2], y -> 1/Sqrt[2]}
という正しい解が得られます。

Mathematica 10.1では
解なし
という間違った結果になります。

いろいろ試してみると,Solveの中に書いた
{x, y} != {-1/Sqrt[2], 1/Sqrt[2]}
という条件が,
x != -1/Sqrt[2] || y != 1/Sqrt[2]
ではなく,
x != -1/Sqrt[2] && y != 1/Sqrt[2]
と解釈されているようです。

Reduceでも同じ問題が起こります。

Reduce[{x, y} != {0, 0}, {x, y}]

Mathematica 9.0では
x!=0 || y!=0
という正しい解が得られます。

Mathematica 10.1では
x!=0 && y!=0
という間違った解が得られます。

というわけで,Mathematica 10.1では,SolveやReduceの中に,ベクトルや行列が等しくないという条件は書けません。とりあえずの解決策は,Or[x != 0, y != 0]のように成分ごとに書くことですが,これでは2次元限定ですし,そもそもMathematicaで成分を書いたら負けな気がするので,「例えば,Mathematica 10.1を避ける」でも仕方ないでしょう。

製造元のウェブサイトには,「世界で最も信頼できる最新技術計算システム」とありますが,それはないと思います。

MathematicaのTeXFormのバグ


Mathematica 10.1, 10.2, 10.3, 10.4.1, 11 for Windows, 10.0 for Raspberry Pi

Mathematicaには,表現をTeX形式に変換するTeXFormがあります。たとえば,TeXForm[Integrate[f[x], x]]とすると「\int f(x) \, dx」を返してくれます。便利です。

しかし,バグがあります。

TeXForm[Abs[r + 1/2]]の結果が「\left\left| r+\frac{1}{2}\right\right|」になりますが,これはTeXで処理できません。正しくは「\left| r+\frac{1}{2}\right|」です。TeXForm[Abs[r]]なら「\left| r\right|」という正しい結果が返ります。

開発元には報告済みですが,今のところ手で直すしかありません。計算結果から自動的に論文を書かせるようなどと思うと困ったことになるでしょう。

素数はなぜ人を惹きつけるのか


4022736038竹内 薫『素数はなぜ人を惹きつけるのか』(朝日新聞出版, 2015)

p.181で紹介されていたアニメーションを作ってみました(コード)。オリジナルの完成度にはかないませんが。

1から60まで(1分)

1から600まで(10分)

p.34 図表3
「整数は自然数と0からなる」(負の整数が抜けています。)
p.43
「300万以下の素数」は「21万6745個」(21万6816個ではないでしょうか。)
p.121
「自明」なもの(証明できるもの)に公理(証明できないもの)を含めています。
p.172とp.182
音階の定義が混乱しています(平均律とピタゴラス音階)。民族音楽の「民族らしさ」は、振動数の微妙な違いによるもののほかに、使う音の違いによるものもあるのではないでしょうか(例:琉球音階)。

Raspberry Pi 2 ファーストインプレッション


B00T356SFO

  • Mathematicaのベンチマーク(WolframMark 10.0.2)
    • Raspberry Pi:1101秒
    • Raspberry Pi 2:304秒(Raspberry Piの3.6倍速い)
    • Core i7 4930K:7.463秒(Raspberry Pi 2の40倍速い)
  • とある計算
    • Raspberry Pi:2200秒
    • Raspberry Pi 2:792秒(Raspberry Piの2.8倍速い)
    • Core i7 4930K:60秒(Raspberry Pi 2の13倍速い)
  • MathematicaのParallel系のコードが無修正で動くようになったが、2コアしか使えない(CPUは4コア)
  • PythonでGPIOが使えない。(そのうち修正されるだろう。)とりあえずの対策:How To Fix Error Loading RPi.GPIO Python Library On Your Brand New Raspberry Pi 2
  • WebIOPiが使えない。(とりあえずの解決策(そのうち修正されるだろう。)
  • MathematicaでGPIOが使えない。(そのうち修正されるだろう。)

MathematicaのFindShortestTour[]のバグ


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

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

追記:問題は3つありますが、Mathematica 10.3.1, 10.4, 11 for Windowsで未解決なのは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.1, 10.2, 10.3, 10.3, 10.4, 10.4.1 for Windowsで未解決)

1分待っても結果が返ってこない場合があります(Core i7-4930K)。(Wolfram/AlphaならOK

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}です。

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