Macintosh SE/30

Macintosh SE/30を購入したのは社会人としてまだ駆け出しの頃だった。購入して5年ほどで電源が入らなくなってしまい物置に入れたまま気がついたら30年以上経過していた。old macの復元も面白いテーマではあるが、仮に復元しても使い道が思い浮かばない。しばらく前から回路部分(メインボード、電源、CRTなど)はメルカリに出し、ケースにRaspberry piでも入れようかと思っていた。

ディスプレイパネル

SE/30の筐体を再利用するための問題はディスプレイパネルだ。縦横比が3:4でSE/30のディスプレイ部分にほぼ収まるディスプレイがなかなか見つからなかったが、やっとAmazonで9.7インチのTFTパネル(IPS液晶パネル 2048x1536 HDMI)を購入できた。

動作しない?

商品が到着して早速動作テストをした。この種の商品の例に漏れず商品ページの情報が全てで説明書は付属していない。HDMIケーブルを接続し、ページ情報の「5~12Vdc あるいは Mirco USB 5Vdcをお勧めます。電流は2A以上」に従って、5V2AのACアダプターをUSBに接続した。が、動作しなかった。「動作すれば基板上のLEDが緑に点灯します」とあるが点灯していない。操作ボタンを押しても何も起きない。ディスプレイも真っ黒のままで全く反応していない感じだった。

トラブルシュート1

このような商品には時々あることなので、とりあえず販売元に「動かないよ」と問い合わせ、返事を待つ間に調べた。いろいろ問題ありだった。操作ボタンへのケーブルは配線済みだったが、コネクタへの差し込み方が間違っていた。普通のコネクタは差し込み方を間違いようがないが、このコネクタはケーブル側と基板側とでピン数が違う。よく見るとスイッチ基板も本体基板もピン数が違っていて、どの位置にも挿入できるという恐ろしい代物だった。スイッチ基板はパターンから回路が推定できたので、GND線と思われる配線を調べた。本体基板のパターンは複雑だがGNDはある程度推定できる。調べてみるとGNDがつながっていない。あれれ、と思って商品写真を良く見ると差し込み方が違っていた。写真通りに差し直したところ、GNDが正しく接続されたようだった。これで良いだろうと電源を入れたが、残念、やっぱり何も起きない。

トラブルシュート2

気を取り直して今度はディスプレイへのフラットケーブルを調べた。このケーブルも配線済みで、写真中央の基板が本体基板からの白いフラットケーブルとディスプレイへの黒いケーブルを中継している。

中継基板はテープで裏返しに固定されていたので、テープを剥がして写真のようにコネクタ側を調べた。すると、なんと黒いケーブルの裏表が逆にコネクタに挿入されていた。この手のフラットケーブルは表裏を逆に入れることは可能だが、ケーブルの電極が見える面をコネクタのピンが見える側に入れる必要がある。作業者がうっかり間違えたのだろうか。ややあきれながら修正し、今度こそと電源を入れたがやはり何も起きない。

トラブルシュート3

こうなると電源が怪しい。「5~12Vdc あるいは Mirco USB 5Vdcをお勧めます」とあるが、5Vでは足りない場合が結構あることを他の製品で何度か経験している。

しかし、基板にはDCコネクタがあるもののセンター電極の極性(電圧の正負)の記載が無い。ほとんどの製品はセンタープラスだがマイナスの製品もあるのが困りものだ。基板のパターンからGNDが分かったので、DCコネクタの金属端子部分にクリップを引っかけて電源装置から9Vを送ったところ、ようやくLEDが点灯しHDMIへ送った画像が表示された。電圧を変えて調べると、6.5V(基板上で測定した電圧)以下では動作しなかった。USB5Vで動作するとは思えないがどういう設計なのだろうか。

その後

その後販売元から連絡があり「DCコネクタを使用してみてください」とのこと。この連絡への返信として「コネクタの差し違い、USB5Vでの動作不良、DCコネクタ極性の不記載」についてレポートを送っておいた。後日、商品ページを見たところ「USB 5V動作しない場合はACアダプタでを利用ください。センタープラス。」の記載が追加されていた。

TFTの電源

5Vから昇圧する

Raspberry Pi 5 は5V5Aを必要とする。動作状態を実測すると2A弱だがUSBへの電力供給のために必要らしい。手持ちの5V14Aのスイッチング電源を使ってpi5にはGPIOの5V端子に5Vを供給し、ディスプレイへは5Vを昇圧して8Vを供給することにした。

DC-DCコンバーターを改造する

ディスプレイ電源として以前入手したDC-DCコンバータ基板を使うことにした。「XL6009昇圧回路基板DC-DC 3-32V〜 5-35V出力電圧調整可能な4A電源電力変換ボード」5個で1000円ちょっとという安物である。

この商品の問題は多回転VRによる5-35Vの可変電圧範囲だ。安い部品を使っているだろうからVRの品質が心配になる。8Vに設定しても接触不良などで突然35Vが出力されると回路は簡単に破損する。「誤動作する電源は無いより悪い」のである。実際、これが原因で基板を壊した苦い経験がある。

VRを固定抵抗と交換する

心配な可変抵抗を固定抵抗に交換することにした。商品はシンプルなので回路は推定できる。制御ICのデータシートに記載されている標準回路をほぼそのまま使っていた。


データシートにしたがって可変抵抗に置き換える抵抗の値を計算した。データシートによると出力電圧Voは、2個の抵抗をR1、R2として下記の通り。

$$Vo=1.25(1+\frac{R2}{R1})$$

商品では、R2は10kΩの可変抵抗、R1は330Ωのチップ抵抗だった。R1と並列にノイズ対策と思われる積層セラミックコンデンサが設置されていた。上式からVoが8VとなるようにR2を決める。計算にはRaspberry Pi OS Full(64-bit)に標準搭載のMathematicaを利用した。

未知数の計算にはSolve関数を使った。引数として数式そのものと計算条件と解くべき変数を渡すだけである。Solveはとても強力な関数であり、遙かに複雑な連立方程式でも数学的に解ける限り答えを返してくれる。

上の式で、R1→330Ω、Vo→8VとしてR2=1782Ωを得た。これに近い抵抗は1.8kΩなので、引数を変えてR1→1.8kΩとした場合のVoが8.07Vであることを確認した。

Mathematica on Raspberry pi

Raspberry piにMathematicaが標準搭載されているのは本当に驚くべき事だと思う。サブスクリプションで年間2万円以上、買い取りでは5万円近くのソフトだ。Raspberry piは教育用だし遅いマシンだからまあいいか、とWolfram氏が考えたのかもしれない。

これは150年以上証明されていない数学上の大予想に現れる数値。piのMathematicaで計算した。書籍によると計算自体が大変困難で予想の発表から50年近く後にようやく最初の15個が計算できたとのこと。凡人には難解さの見当すら付かないが、Mathematicaは、わずか1行、リターン1発で算出する。ここでは1番目の数値を50桁まで求めたけれど、100桁でも1000桁(4秒かかった)でも100番目でも1000番目でも、平方根みたいにあっさり計算する。

Raspberry pi は5になって計算速度がさらに向上し、pi3のMathematicaの「なんとか動く」という印象から「そこそこ使える」印象になった。Mathematicaのバンドルが中止にならならないか心配になるレベル。

仕事でもプライベートでもさまざまなソフトウエアを使ってきたが、四半世紀使い続けている単体のアプリケーションはMathematicaと$LaTeX$くらい。双方とも芸術の域に達していると思う。特にMathematicaは素晴らしい。Mathematica本来の数学の世界でどれほどの能力があるかは知るよしもないが、回路設計やソフトウエア上の込み入った計算にいつも的確に答えてくれる。(光栄なことに開発者のStephen Wolframとは同い年)

piと接続した

Raspberry piからのHDMIを接続しパネルには電源装置から5Vを供給した。点灯状態での電源電流は1.37A(6.8W)で、昇圧基板の出力電圧は実測で7.97V、ディスプレイ基板の入力電圧は7.86Vだった。

SE/30のケースに入れた

バラックで動作を確認できたので早速ケースに入れた。ディスプレイパネルはオリジナルの9インチCRTより少し大きい。画面が少しケラレるため四隅が丸く見える。このおかげでオリジナル感が強調されたような気がする。思い出してみるとSE/30のデスクトップ(写真はオリジナル)は四隅が丸かった。

ケースの丸みにデスクトップを合わせたのか、ケースを含めたイメージに合わせたのか、ジョブス氏こだわりの丸みだったのかもしれない。中身は変わってしまったけれど、30年の時を経たマシンがよみがえったようで嬉しくなった。

完成したpi5マシンは、現在サーバー用にヘッドレスで使っているpi3と代替するための作業をしている。机の下のケーブルラックに転がっていたpiサーバーは、PI/30としてめでたく机上に昇格した。主な用途はやはりヘッドレスなのでディスプレイにはスライドショーを表示しようかと考えている。



手指消毒器の修理

 手指消毒器具を修理した

先端が折れてしまった

机から落とした衝撃で、吐出口への水平パイプが根元付近でポッキリと折れてしまったので修理した。写真で水平パイプが太くなっている部分が修理箇所。

何度か失敗した

溶剤

アクリルなどは、もともと折れてなかったかのように溶剤でしっかり接着できる。これを期待して二塩化メチレン(ジクロロメタン、アクリル接着剤として市販されている)を使ってみたが、全くだめだった。他の溶剤もあるがパイプが溶けてぐにゃぐにゃになる恐れもあるので止めることにした。

エポキシと熱収縮チューブ

エポキシで断面を接着した。これだけでは曲げに極端に弱いので、パイプ部分に熱収縮チューブを被せ、150℃に設定したヒートガンで慎重に加熱した。良さそうに見えたが、固まりかけていたエポキシ接着剤が熱で軟化してチューブの端面からはみ出した。おまけに破断部分が少し曲がってしまった。ややみっともないが使えればいいかと思って放置。しばらくしてヘッドを押してアルコールの吐出を確認したところ...

吐出圧が結構高い

何度か吐出を試みると、消毒液がチューブとパイプの間から染み出してポタポタ垂れる。これでは使えないのでやり直しだ。吐出圧が結構高いので、圧力に耐える強度が必要であることがわかった。

修理できた

3Dプリンタでガイドパイプを作った

強度のあるガイドパイプで補強することにした。単純なパイプだがちょうどいい寸法のものは簡単に入手できない。こんなときは3Dプリンタの出番だ。折れたパイプの直径は6.3mmなので、クリアランスを片肉0.1mmとして内径6.5mm、パイプ肉厚2mm程度として外径10mm、長さ20mmのパイプを作った。単なるパイプなので3D形状の設計は1分程度の作業。積層ピッチ0.1mmで印刷時間は18分だった。使用したフィラメントはPLA、長さ40cm(質量1g)。

経験的に設定した0.1mmのクリアランスがちょうどよかったようで、やや力を入れてねじ込む感じになった。それでも高い吐出圧により液がにじみ出る可能性があるので、ねじ込む前にエポキシ接着剤を若干塗布した。

ねじ込むことで余分なエポキシがガイドパイプの端面に盛り上がる感じになった。この盛り上がりがうまい具合に端面を封止しているように見える。

白色のフィラメントを使ったが、直前まで黒色のフィラメントを使っていたため、写真では、ガイドパイプの左側(積層開始側)が黒ずんでしまった。

 3Dプリンタが壊れた

これまで使っていた3Dプリンタが不調になった。印刷を始めると、対象物が端の方からめくれ上がってしまって形にならない。このような場合、材料を印刷していく台(ビルドプレート)とノズルとの距離を調整すると改善するのだが、今回はだめなようだ。

3年前にAmazonで4万円程度で購入した機種(ANYCUBIC MEGA-s)で、活躍していたが結構不満もあった。ノズルなど消耗品の交換が必要なのだろうと思うが、この機会に更新したくなった。

  • ビルドプレートの傾き調整が手動
    ノズルのZ座標がゼロのとき、ノズル先端とビルドプレートとの距離がA4用紙1枚分の厚さになるように4隅のネジでテーブルの傾きを調整する。この作業に手間がかかる。一旦調整すれば良さそうだが、実際はずれるので時々調整しなければならない。ずれると印刷物が剥がれてしまったり、ノズルがテーブルをこすってしまったり、面倒なことになる。
  • ビルドプレートの傾きが合わない
    プレートが平面で、ノズルがXY平面内で動くなら、プレートの3点の高さを調整することで両者の法線が一致するはずだが、これがうまくいかない。プレートの中央で高さを合わせると四隅が低すぎたり、とにかく気持ちよく合わない。プレートはガラス製なので平面度は高いとすると、ノズルが平面で動かないのではないか。
  • うるさい
    フレームが鉄板の板金加工で、ガイドポストに沿ってテーブルやヘッドが動くのだが、がちゃがちゃ音がする。各部にガタがあるのだろう。

分解した

使える部品をとっておくことにした。ステッピングモーターが5個。Z軸の送りネジは4条ネジだった。リニアシャフトとスライドブッシュ(手前のビニール袋)は、単体部品で購入すると結構な値段になる。精度は不明だけど。


回路基板は使いようもないので廃棄。ボードにTriGorilla_V0.0.2と印刷されていたので、調べると単体でも売っていた。3Dプリンタの制御ソフト(ファームウエア)は改造が盛んに行われているようなので、GitHubにも関連のプロジェクトが複数ある。CPUはAtmelのATMEGA2560(8bit16MHz)だった。

モータドライバはHR4988を使っているようだ。アマゾンで6個1200円。中国製品は自社開発に拘らずパーツを集めて製品にするようだけど、3Dプリンタも同様らしい。お陰でブラックボックス部分が少なくなり値段も下がるのだろう。

分解してみるとネジがやたら多い。あらゆる場所がネジで止めてあるのでM3の6角ボルトが大量に出た。板金加工の本体にパーツをねじで止めるだけ。いわゆる「ネジと馬鹿穴」なので精度を期待するほうが無理な構造だった。これだけのネジを手で外すのはしんどい。6角レンチを切断して6角棒を作り、電動ドライバに付けて使った。

買い替えた

購入したのは ANYCUBIC BYPER 。前と同じメーカーの新しい機種で、値段は前と同程度だった。板金加工ではなくアルミ押し出し材(多分)のフレーム。組み立ても一応フレームの端面を突き当てるので、面精度が出ていれば組み立てによる精度も期待できる構造だ。前の製品に比べるとしっかりした作りに感じられる。

  • ビルドプレートの高さ調整が不要
    ノズル部分にタッチセンサー(ひずみゲージ)が内蔵されていて、自動で高さを調整する。ビルドプレートは固定なので、プレート各部(4x4の16か所)のZ座標を測定して、ヘッドの動きをテーブルに合わせるようだ。
  • 振動が少ない
    アルミ押出材のフレームがそのままガイドになっていて、ベアリング入りのローラーで支持されたヘッドやテーブルがガイド上を移動する。ガタが少ないようだ。
  • 静か
    ステッピングモーターの音が小さい。これは想像だが、モーター加減速の加速度が小さいのだと思う。

角が膨らむ

使ってみると、少し問題を感じた。印刷物の角が少し膨らむのだ。このようなL字部品を印刷すると角が少し膨らんでしまう。以前の機種も同様の傾向があったが、新しい機種はより目立つ感じがする。これは面白くない。


ファームウエアを書き換えた

Webで調べると、コーナーでヘッドの移動速度が遅くなってもフィラメント(インクに相当する材料)の供給速度が変化しない場合、フィラメントの供給が過剰になって膨らむのだそうだ。プリンタ制御ソフト(ファームウエア)を変更すると解消するらしい。手順は次の通りだが、バージョンやライブラリの違いとかいろいろあって、まる1日かかった。

  • GitHubからプロジェクトをダウンロード
  • Platformio環境でコンパイル
  • できたバイナリファイルを入れたSDをセットして電源ON
  • 有志によるオープンソースなので何が起きても自己責任

テストパターンを印刷した。水平に線を引くのだが中央部はヘッドスピードが高い。次の写真はオリジナルのファームウエアだが、中央部が細くなっている。フィラメントの供給がヘッドスピードに対して少ないことが分かる。

次の写真は変更したファームウエアによる印刷結果。加工プログラムは同じだが、中央部が細くなっていない。複数の線は、ヘッドスピードに対するフィラメントの送り速度を決めるパラメタを変更した結果を示す。一定の効果はありそう。

ファームウエア変更後の効果

L字部品の角部分を見ると、完全ではないが効果はあった。左が変更後で右が変更前。

不思議なことだが、メーカーサイトからダウンロードした正規のファームウエアのサイズが400kBで、オープンソースをコンパイルしてできたファームウエアが200kB程度。半分くらいのサイズで、マシンへの書き込み時間も短い。やや心配だが動作に怪しい点はない。ヘッド位置の自動設定も動作する。操作パネルの表示にもおかしな点はないし、バージョン表示も変わりない。本当にファームウエアが書き換わったのだろうかと心配になるほど動作上の違いがない。正規のファームウエアとオープンソースとの関係はどうなっているんだろう。

ペン型はんだごてを作った

USBはんだごてを買った

どこでも作業ができるように必要な工具一式を持ち歩いている。はんだ付け用に普通の100V仕様のはんだごてを入れているけれど、かさばるし100Vのコンセントが必要。それに外では本格的なはんだ付け作業はしないのでオーバースペックだなあと常々思っていた。


そこで、USB接続のはんだごて「goot(グット) USBはんだこて モバイルバッテリーでどこでも使用可能 MSD-5、1,782円」をAmazonで買ってみた。消費電力は、5V1Aの5W。電流計で測定すると0.92Aだった。こんな小電力でまともに使えるだろうか?

結構使えるが不満もある

ところが、どうしてどうして、結構使える。20から30秒で使用温度になり、電子部品、ヘッダーピンなどのはんだ付けは全く問題なし。さすがにターミナルなど大きめの部品は辛そうだが、十分以上に実用になる。電源OFFでの冷却も速い。これはいい。だが本格的に使おうと思うと不満が出てきた。

まず、太い。100Vのはんだごてと同程度に太い。本体をひねるとL字型に変形する構造だが不要。小電力なのにケーブルが結構太くて硬い。安物なのでバリが出ていたり接続部に段差があったり、微妙に曲がっていたり。要するに使い心地が悪くて面白くない。

改造できるか?

本体を開けてみるとスイッチとヒューズと通電表示のLEDがあるだけ。要するに5Vをコテ先に供給すればよい。コテ先は、ヒーターが組み込まれたボールペンの芯のような金属パイプで別売り品と交換できる。これなら改造は簡単だ。

ボールペンタイプに改造

コテ先がボールペンの芯だからボールペン型に改造。このときのために(笑)保存しておいた使用済みのボールペン(STAEDTLERだよ)の軸を使用。コテの金属パイプが若干細いので熱収縮チューブとカプトンテーブでしっくり嵌まる太さに調整。気に入らない電源ケーブルは、被覆が網掛けで柔らかく低抵抗で急速充電対応のUSBケーブルに交換。先端付近に通電を示すLEDも付けた。

完成

電源スイッチは省略。モバイルバッテリー使用が前提なので、バッテリー側のスイッチを使う。通電するとLEDが点灯する。写真のバッテリーは6500mAhなので、0.92Aなら7時間連続使用できる計算。写真のように平置きしてもコテ先が軽いので先端は机の表面から浮いている。

自画自賛

見た目はいかにも素人細工だけど、ペンのように扱えるから細かい作業が楽、ケーブルが柔らかいので取り回しも良い。スケルトン軸内で点灯する緑色のチップLEDも洒落てる感じ。狙い通りでごきげんだ。STAEDTLER stick 430M のロゴが握り心地を良くしているかも?

ちょっと心配なのは、コテ先の金属パイプが接触しているボールペン軸の先端部分。熱収縮チューブとカプトンテープを介して伝わる熱に耐えられるだろうか。コテの電力は高々5Wだから長さ約50mmの金属パイプで十分冷却されると期待し、しばらく使って様子を見よう。

電卓でリーマンの素数個数関数を計算した

素数の個数を求める式

かなり昔から、ある数nより小さい素数の個数$p$は、次の簡単な式で近似できることが知られていた。

$$p\sim\frac{n}{log(n)}$$

素数と自然対数には深い関係があるらしい。それは何か。素数は無限にあるけれどこの関係はどこまでも続くのか。当時の学者もそう思って研究したようだが、なかなか解決できなかった。その中、1859年に数学者リーマンが次の式を発見した。

$$\pi(x)=\sum_{n=1}\frac{\mu(n)}{n}J(\sqrt[n]{x}) ただし \sqrt[n+1]{x}<2 まで$$

$\pi(x)$は素数の個数を表す関数で、どんな大きな$x$に対しても$x$より小さい素数の個数が得られる。見れば見るほど不思議な式だ。$x$は自然数ではなくて実数、右辺には$n$乗根もあるのに、和は素数の個数という自然数に収束するというのだから。$\mu(n)$はメビウス関数という変な関数。$n$がどのような素数の積かによって$-1,0,1$のどれかの値になる。$J(x)$は、次のように定義されてる。

$$J(x)=Li(x)-\sum_{\rho}(Li(x^\rho)+Li(x^{1-\rho}))-\log2+\int_x^\infty\frac{dt}{t(t^2-1)\log t}$$

$Li(x)$や$\rho$など見慣れない記号があるが、調べてみると電卓でも計算できそう。2番めの項の$\rho$が複素数なので、複素数の関数計算ができる電卓が必要だ。式の詳細は理解できないから計算のための情報は書籍やネット頼み。途中が怪しくても、それなりの計算結果が得られればよし、としよう。

なぜ電卓?

実際に素数の個数を知ることは簡単だ。https://ja.wolframalpha.com/へ行って、$PrimePi(1000,000)$と入力すれば100万以下の素数が78498個あることがすぐに分かる。今回の興味は、今も数学者を悩ます歴史的な数式を電卓で計算する、ということにある。上の式の複素数$\rho$は、計算機の父チューリングも計算したとのこと。複素数で$\log(x)$や$e^x$の計算ができるHP35sを購入したので、摩訶不思議な数式を電卓で計算できたら面白い!というノリだ。電卓の複素数計算自体が面白くて、例えば虚数単位$i$の$i$乗を計算したのが右の写真。

$$i^i=e^{-\frac{\pi}{2}}\sim0.2078795763507619085469...$$

これは実数しかも超越数。

近似計算

$J(x)$の計算がプログラムの中心。第2項の$\rho$は無限個あることが証明されているから、加算も無限回でスパコンでも完全な計算はできない。それに電卓の計算速度は極端に遅いから、実際に加算できるのは10項以下だろう。正確な値を求めるプログラムにはならないが、そこは気楽な素人の遊びということで。

第1項 $Li(x)$

この項はネットで見つけた計算式で求めた。$\log$は自然対数なので電卓ではLNだ。この項は複素数ではないので普通の電卓でも計算できる。

$$Li(x)=\frac{x}{\log x}\sum_{k=0}^n\frac{k!}{\log(x^k)}$$

正しい値と比べてみると$x$の値に対して必要な精度が得られる項数$n$が異なる。プログラムでは必要な精度が得られるように$x$の値から$n$を適当に計算した。

第2項 $\sum Li(x^\rho)$

この項の計算が今回の中心だ。$\rho$はリーマンの論文に出てくるゼータ関数 $\zeta(s)$とやらがゼロとなる値で複素数。

$$\rho=\frac{1}{2}+i t ただし \zeta(\rho)=0$$

$\rho$の計算は大変複雑らしいが、先程のhttps://ja.wolframalpha.com/でN[ZetaZero[1],20]と入力すれば、1番目の$\rho_1$が20桁まで計算できる(感謝)。

$\rho_1=0.50000000000000000000 + 14.134725141734693791 i$

このサイトでプログラムに使う$\rho_1\sim\rho_8$を計算した。

$$Li(x^\rho)=Ei(\rho\log x)$$
$$Ei(z)=\frac{e^z}{z}\sum_{k=0}^n\frac{k!}{z^k}$$

第1項と似たような計算式だが、$\rho$が複素数なので35sの出番。調べた$\rho_1\sim\rho_8$の複素数値をそのまま使って関数計算する。$Ei(z)$の近似値を求める和は、実部はかなり正確だったが虚部は誤差が大きくなった。でも最終的な計算では実部の値しか使わないので助かった。リーマン先生は、全ての$\rho_n$の実部は$\frac{1}{2}$である、と予想したが、論文発表から160年が経過する現在でも証明されていない。証明に100万ドルの懸賞金がかかっている。

第3,4項

この2項は大きな値にならないとのことなので省略した。35sには数値積分の機能があるけれど時間がかかりすぎて使えそうにない。

プログラム

複雑な計算なので、プログラムは複数の部分に分けた。HP35sを持っていないと意味はないが、記録のために記載。こうして記載してみるとそれほど長いプログラムではない印象。

  • $Ei(z)$の計算
E001LBL E
E0021
E003XEQ E009E009以下をサブプログラムとして実行
E004RCL÷ Z
E005RCL Z
E006$e^x$
E007×
E008RTN
E009STO O
E010R↓
E011STO Z
E0121
E013STO S
E014STO K
E015RCL÷ Z
E016RCL× K
E017STO+ S
E018ISG K
E019ENTER
E020DSE O
E021GTO E015
E022RCL S
E023RTN
  • $Li(x)$の計算
L001LBL L
L002STO Y
L003LN
L004ENTER
L005IP
L0061
L007-
L008XEQ E009
L009RCL× Y
L010RCL Y
L011LN
L012÷
L013RTN
  • $J(x)$の計算
第2項の$\rho$による和は計算時間を勘案して8項までとした。

$\rho=\frac{1}{2}+it$は、最初の8個をメモリに入れ実行時に参照した。

$t=\{14.1347251417,\;21.0220396388,\;25.0108575801,\;\cdots\}$だ。
HP35sでは、$\rho_1$を $0.5\;i\;14.1347251417$ と入力する。

J001LBL J
J002LN
J003STO X変数Xに$\log{x}$を入れておく
J004LASTx
J005XEQ L001$Li(x)$を計算
J006STO QメモリQに格納
J0070$\sum_{\rho} Li(x^\rho)$計算開始
J008STO T和を入れる変数Tをクリア
J00930.037メモリの30〜37番地に$\rho$の値が8個格納されている
J010STO Iループカウンタを初期化
J011RCL(I)$\rho$(複素数)をメモリから得る
J012RCL× X$\rho\log{x}$を計算
J013XEQ E001$Li(x^\rho)$を$Ei(\rho\log{x})$で計算
J014STO+ T結果をTに加算
J015ISG Iループ終了を検査
J016GTO J008
J017RCL Q$Li(x)$を呼び出す
J018RCL T$\sum(Li(x^\rho)+Li(x^{1-\rho}))=2Re(\sum Li(x^\rho))$
J0192虚部が相殺されるので和は実部の2倍
J020×
J021ENTER
J022ABS実部を計算(35sには実部を得る機能がない)
J023x<>y$Re(z)=|z|\cos(\arg(z))$
J024ARG
J025COS
J026×
J027-$J(x)=Li(x)-\sum_{\rho}Li(x^\rho)$が得られる
J028RTN
  • $\pi(x)$の計算

メビウス関数$\mu(n)$は事前に計算した値をメモリに入れ実行時に参照。調べると$\pi(10^{12})$まで計算するには$\mu(40)$程度までの値が必要と思われたが、P026の短縮により実際の計算は$\mu(10)$程度で終了する。


P001LBL P
P002STO P
P0030
P004STO W
P005STO Vここまでは内部変数等の初期化
P00640メモリの40番地から$\mu(n)$の値が格納されている
P007STO J
P0081$\pi(x)$計算のループ先頭
P009STO+ V
P010STO+ J
P011RCL(J)$\mu(n)$を得る
P012x=0?
P013GTO P009$\mu(n)=0$なら$J(x)$は計算不要
P0142
P015RCL P
P016RCL V
P017PSE途中経過を表示するため1秒停止
P018$\sqrt[x]{y}$$\sqrt[n]{x}$
P019$x\le y$?$\sqrt[n]{x}<2$なら計算終了
P020GTO P030
P021XEQ J001$J(\sqrt[n]{x})$を計算
P022RCL÷ V$/n$
P023RCL×(J)$\frac{\mu(n)}{n}$
P024STO+ WW $=\sum \frac{\mu(n)}{n}J(\sqrt[n]{x})$
P025ABS
P0261.0計算時間短縮のため 項<1 なら計算中止
P027x<y?
P028GTOP009
P029RCL W
P030ENTER
P031INTG
P032RTN

計算結果

プログラムの実行結果は次のとおり。肝心の$\rho$についての和は8項にすぎないが、$\rho$を使わない計算と比べると計算精度が改善されている。下表のように加算する項数が0($\rho$を使わない),5,8と増えると誤差は減少する。10億未満の素数の個数は5000万個以上あるが、それが9個の誤差で得られているのはいい感じだ。

$x$
$\pi(x)$
$\pi(x)$と計算結果との差
計算時間
(秒)
0項5項8項
10025-1-1-135
1,000168-1-2-228
100,0009,592-41135
1,000,00078,49829191942
1,000,000,00050,847,534-79-66950
10,000,000,000455,052,511-1,827-817-33551
1,000,000,000,00037,607,912,018-1,475-2,629-347851

表末尾の$x=10^{12}$(10兆)では誤差の大小が逆転する。近似式の問題だろうか、それとも35sの有効桁数に近づいて計算誤差が累積しただろうか。計算時間は8項加算の時間だが、直線的に増えないのは、前述の$\mu(n)$関数の値によって計算量が不連続に変化することが影響していると思われる。途中経過の表示をやめると計算時間を5~10秒短縮できる。

印象と課題

HP35sのプログラム言語は、キーボードマクロに最小限の制御命令が追加されたコンパクトな仕様だが、メモリ参照命令が効果的で、素直に計算式をプログラム化できたことに感心した。計算速度もまあまあだ。課題は計算精度。近似式の検討、計算時間短縮のために省略した項や和の打ち切りなどを上手に処理できれば精度の向上が期待できる。次の機会に考えてみよう(いつになるやら)。

感想

素数の個数が実数や複素数の関数計算で求められることは、やはり不思議な感じがする。150年以上数学者の挑戦を跳ね返し続けているリーマン予想、そのややこしい式が手のひらで計算できるのを見たら、リーマン先生も面白がってくれるだろう。

Macintosh SE/30

Macintosh SE/30を購入したのは社会人としてまだ駆け出しの頃だった。購入して5年ほどで電源が入らなくなってしまい物置に入れたまま気がついたら30年以上経過していた。old macの復元も面白いテーマではあるが、仮に復元しても使い道が思い浮かばない。しばらく前から回路部...