Mathematica on RaspberryPi Zero ワークショップのためのプログラム例
ワークショップのための
Mathematica の短いプログラム例
kobayashikorio@gmail.com
2017/4/5
以下のプログラムは、Macで閲覧しながら、コピーし、VNCビューワーで動かしているMathematicaのノートブックにペーストできる。
例1. RaspberryPi Zero は強力ではないが非力でもない
• 10万項からなる多項式の展開
Timing[Length[Apply[List,s=Expand[(w+x+y+z)^52 w(x+1)(y+2)(z+3)]]]]
Timing[{Length[Apply[List,s=Expand[(w+x+y+z)^23 w(x+1)(y+2)(z+3)]]],Factor[s]}]
• 次数10万の疎な多項式の整数根の計算
s=x^(10^5)-123456 x^100+789x^11;
f=s/.x->987654321;
Timing[Reduce[s-f==0,x,Integers]]
• 100万までの全素数の計算
Timing[Table[Prime[n],{n,PrimePi[10^6]}];]
• 10×10の記号行列の行列式の計算
m=Table[ToExpression["x"<>ToString@i<>ToString@j],{i,10},{j,10}];
Timing[d=Det[m];]
• 1千万個の要素からなるリストの並べ替え
Timing[Sort[Range[10^7,1,-1]];]
• 100万個の文字からなる文字列の検索
s=StringReplace[ToString[RandomInteger[5,10^6]],", "->""];
Timing[Length[StringCases[s,"0000000"]]]
例2 問題を解くための各種方法
問題:10 未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、 これらの合計は 23 になる。 同じようにして、100, 000 未満の 3 か 5 の7 の倍数になっている数字の合計を求めよ (Project Euler #1 の拡張問題)。
n=10^5-1;
Total[Select[Range[n],Divisible[#,3]||Divisible[#,5]||Divisible[#,7]&]]
2714264277
Total[Range[n]/.x_/;!Divisible[x,3]&&!Divisible[x,5]&&!Divisible[x,7]->0]
2714264277
Total[Select[Range[n],Function[y,Apply[Or,Map[Function[x,Divisible[y,x]],{3,5,7}]]]]]
2714264277
Total[Table[If[Divisible[i,3]||Divisible[i,5]||Divisible[i,7],i,0],{i,n}]]
2714264277
(s=0;Do[If[Divisible[i,3]||Divisible[i,5]||Divisible[i,7],s+=i],{i,n}];s)
2714264277
Sum[If[Divisible[i,3]||Divisible[i,5]||Divisible[i,7],i,0],{i,n}]
2714264277
(For[s=0;i=1,i<=n,i++,If[Divisible[i,3]||Divisible[i,5]||Divisible[i,7],s+=i]];s)
2714264277
Total[Reap[Scan[If[Divisible[#,3]||Divisible[#,5]||Divisible[#,7],Sow[#]]&,
Range[n]]] [ [2,1] ]
]
2714264277
Fold[(#1+If[Divisible[#2,3]||Divisible[#2,5]||Divisible[#2,7],#2,0])&,0,Range[n]]
2714264277
(f[p_]:=(p*Quotient[n,p]*(Quotient[n,p]+1)/2);f[3]+f[5]+f[7]-{f[3*5]+f[3*7]+f[5*7]}+f[3*5*7])
{2714264277}
例3 秒針時計
ここでは時計の秒針のみを表示するサンプルを提示する。
s=N[Table[{ Sin[2Pi k/60],Cos[2Pi k/60]},{k,0,59}]];
Show[{ListPlot[s,AspectRatio->1.0,Ticks->None],
Graphics[{Red,Arrow[{{0,0},
Dynamic[s[[
t=Clock[{1,60,1},60]]]]}]}]},
ImageSize->200]
例4 文字を要素とした正則行列
a={{不可,可,良,優},{優,不可,可,良},{良,優,不可,可},{可,良,優,不可}};
a//MatrixForm
({
{不可, 可, 良, 優},
{優, 不可, 可, 良},
{良, 優, 不可, 可},
{可, 良, 優, 不可}
})
Simplify[a .Inverse[a]]==Simplify[Inverse[a] .a]==IdentityMatrix[4]
True
例5 wikiquoteを読み込む
x@a__:=StringCases@a
y@c__:=StringReplace@c
z@e_:=Shortest@e
s=Import["http://en.wikiquote.org/wiki/Steve_Jobs","Source"];
s1=StringCases[s,"<li><b>Was"~~__~~"editsection"];
s2=StringReplace[s1,{"<li>"->"+","<div"~~__~~"</div>"->"",Shortest["<"~~__~~">"]->""}];
s3=Flatten@StringCases[s2,Shortest["+"~~__~~"+"]];
s4=StringReplace[s3,"+"->""];
RandomChoice[s4]
We believe it's the biggest advance in animation since Walt Disney started it all with the release of Snow White 50 years ago.