thonny Version 4.0.0b3

MacOS、Ubuntuで愛用しているPython用IDE
PyCharmとSpyderも使っています。
それぞれに多機能・高機能充実していますがその分手軽ではありません。

ThonnyはUbuntuで使い始めました
エディター画面と実行コンソール画面の構成がシンプルで非常に手軽で便利です
MacOS版 Download version3.3.13を使ってみると、日本語のインライン変換ができずに不便でした

Pre-release版Version 4.0.0b3がリリースされています
スクリーンショット 171
試したところ日本語のインライン変換ができるようになっていました

スクリーンショット 172

関・ベルヌーイ数 Pythonコード

■12月12日(日)11:00-12:00 桜井進のPython・UNIX・Math教室(応用コース)
スクリーンショット 2021 12 13 1 20 37

超入門・Pythonで関・ベルヌーイ数

  1. My code
  2. Akiyama-Tanigawa algorithm
  3. B(n) is just sum of k^n formula linear term coefficient.
  4. Zeta function algorithm

Seki bernoulli 001
Seki bernoulli 002
Seki bernoulli 003

# 1. My code
# seki-bernoulli_1.py

from fractions import Fraction

# 二項係数 Combination nCk
def comb(n, k):
    prod = 1
    for t in range(min(k, n-k)):
        prod = prod * (n-t)//(t+1)
    return prod

# Seki-Bernoulli number Bn
def B(n):
    if n == 0:
        return 1
    else:
        ss = 0
        for k in range(0, n):
            ss = ss + ((-1)**k) * comb(n+1, k)*B(k)
        return Fraction((-1)**(n+1), n+1) * ss


n = int(input('B(n)のnの上限 >>> '))
import sympy
for i in range(n + 1):
    print(f"B({i})= {B(i)}".ljust(20, " "),f"sympy.bernoulli({i})=",sympy.bernoulli(i))

実行結果

$ python seki-bernoulli_1.py
B(n)のnの上限 >>> 20
B(0)= 1              sympy.bernoulli(0)= 1
B(1)= 1/2            sympy.bernoulli(1)= -1/2
B(2)= 1/6            sympy.bernoulli(2)= 1/6
B(3)= 0              sympy.bernoulli(3)= 0
B(4)= -1/30          sympy.bernoulli(4)= -1/30
B(5)= 0              sympy.bernoulli(5)= 0
B(6)= 1/42           sympy.bernoulli(6)= 1/42
B(7)= 0              sympy.bernoulli(7)= 0
B(8)= -1/30          sympy.bernoulli(8)= -1/30
B(9)= 0              sympy.bernoulli(9)= 0
B(10)= 5/66          sympy.bernoulli(10)= 5/66
B(11)= 0             sympy.bernoulli(11)= 0
B(12)= -691/2730     sympy.bernoulli(12)= -691/2730
B(13)= 0             sympy.bernoulli(13)= 0
B(14)= 7/6           sympy.bernoulli(14)= 7/6
B(15)= 0             sympy.bernoulli(15)= 0
B(16)= -3617/510     sympy.bernoulli(16)= -3617/510
B(17)= 0             sympy.bernoulli(17)= 0
B(18)= 43867/798     sympy.bernoulli(18)= 43867/798
B(19)= 0             sympy.bernoulli(19)= 0
B(20)= -174611/330   sympy.bernoulli(20)= -174611/330

案の定、関数B(n)は再帰的定義をしているため、B(30)の計算はできません。
結果をsympy.bernoulli()と比較してみます。

Seki bernoulli 002

このアルゴリズムはヤコブ・ベルヌーイによるべき乗和による導入によるもの
したがって、B(1)=\frac{1}{2}
sympy.bernoulli(1)=-1/2 は、現在主流である母関数\frac{x}{e^x-1}による関・ベルヌーイ数の定義

Seki bernoulli 001

次はゼータの負の整数に対する公式によるもの
関数mpmath.zeta()を用いるだけのコード

# 4 zeta fuction algorithm
# seki-bernoulli_4.py

print('4 zeta fuction algorithm')
n = int(input('B(n)のnの上限 >>> '))

from mpmath import zeta
def B(m):
    b = -m * zeta(1-m)
    return b

from sympy import *
for i in range(1, n + 1):
    b = B(i)
    c = Rational(b)
    print(f"B({i})= {c}".ljust(20, " "),f"sympy.bernoulli({i})=",bernoulli(i))

実行結果

$ python seki-bernoulli_4.py
4 zeta fuction algorithm
B(n)のnの上限 >>> 50
B(1)= 1/2            sympy.bernoulli(1)= -1/2
B(2)= 1/6            sympy.bernoulli(2)= 1/6
B(3)= 0              sympy.bernoulli(3)= 0
B(4)= -1/30          sympy.bernoulli(4)= -1/30
B(5)= 0              sympy.bernoulli(5)= 0
B(6)= 1/42           sympy.bernoulli(6)= 1/42
B(7)= 0              sympy.bernoulli(7)= 0
B(8)= -1/30          sympy.bernoulli(8)= -1/30
B(9)= 0              sympy.bernoulli(9)= 0
B(10)= 5/66          sympy.bernoulli(10)= 5/66
B(11)= 0             sympy.bernoulli(11)= 0
B(12)= -691/2730     sympy.bernoulli(12)= -691/2730
B(13)= 0             sympy.bernoulli(13)= 0
B(14)= 7/6           sympy.bernoulli(14)= 7/6
B(15)= 0             sympy.bernoulli(15)= 0
B(16)= -3617/510     sympy.bernoulli(16)= -3617/510
B(17)= 0             sympy.bernoulli(17)= 0
B(18)= 43867/798     sympy.bernoulli(18)= 43867/798
B(19)= 0             sympy.bernoulli(19)= 0
B(20)= -174611/330   sympy.bernoulli(20)= -174611/330
B(21)= 0             sympy.bernoulli(21)= 0
B(22)= 854513/138    sympy.bernoulli(22)= 854513/138
B(23)= 0             sympy.bernoulli(23)= 0
B(24)= -236364091/2730 sympy.bernoulli(24)= -236364091/2730
B(25)= 0             sympy.bernoulli(25)= 0
B(26)= 8553103/6     sympy.bernoulli(26)= 8553103/6
B(27)= 0             sympy.bernoulli(27)= 0
B(28)= -23749461029/870 sympy.bernoulli(28)= -23749461029/870
B(29)= 0             sympy.bernoulli(29)= 0
B(30)= 8615841276005/14322 sympy.bernoulli(30)= 8615841276005/14322
B(31)= 0             sympy.bernoulli(31)= 0
B(32)= -7709321041217/510 sympy.bernoulli(32)= -7709321041217/510
B(33)= 0             sympy.bernoulli(33)= 0
B(34)= 2577687858367/6 sympy.bernoulli(34)= 2577687858367/6
B(35)= 0             sympy.bernoulli(35)= 0
B(36)= -26315271553053477373/1919190 sympy.bernoulli(36)= -26315271553053477373/1919190
B(37)= 0             sympy.bernoulli(37)= 0
B(38)= 2929993913841559/6 sympy.bernoulli(38)= 2929993913841559/6
B(39)= 0             sympy.bernoulli(39)= 0
B(40)= -261082718496449122051/13530 sympy.bernoulli(40)= -261082718496449122051/13530
B(41)= 0             sympy.bernoulli(41)= 0
B(42)= 1520097643918070802691/1806 sympy.bernoulli(42)= 1520097643918070802691/1806
B(43)= 0             sympy.bernoulli(43)= 0
B(44)= -27833269579301024235023/690 sympy.bernoulli(44)= -27833269579301024235023/690
B(45)= 0             sympy.bernoulli(45)= 0
B(46)= 596451111593912163277961/282 sympy.bernoulli(46)= 596451111593912163277961/282
B(47)= 0             sympy.bernoulli(47)= 0
B(48)= -5609403368997817686249127547/46410 sympy.bernoulli(48)= -5609403368997817686249127547/46410
B(49)= 0             sympy.bernoulli(49)= 0
B(50)= 495057205241079648212477525/66 sympy.bernoulli(50)= 495057205241079648212477525/66

Markdown+WordPress+KaTeX

WordPressでTeXコードによる数式表示を実現するには
Markdownを使えるようにするプラグインをインストールすればいい
ただ他のプラグインとの関係など実際にインストールして使ってみないと使い勝手がわからない
私が選んだのは

WP Editor.md

スクリーンショット 166

KaTeXのセッティングをすればMarsEditの中にLaTeXコードを作文できる
スクリーンショット 169

MarsEdit

MarsEditで本投稿を作文しているところ
スクリーンショット 168

$$\frac{2x}{\sqrt{\pi}}-\frac{2x^3}{3\sqrt{\pi}}+\frac{x^5}{5\sqrt{\pi}}-\frac{x^7}{21\sqrt{\pi}}+\frac{x^9}{108\sqrt{\pi}}+\operatorname{O}\left(x^{10}\right)$$

\frac{2x}{\sqrt{\pi}}-\frac{2x^3}{3\sqrt{\pi}}+\frac{x^5}{5\sqrt{\pi}}-\frac{x^7}{21\sqrt{\pi}}+\frac{x^9}{108\sqrt{\pi}}+\operatorname{O}\left(x^{10}\right)

$$\zeta(2)=\sum_{n=1}^{\infty}\frac{1}{n^2}=\prod_{p:prime}\frac{1}{1-\frac{1}{p^2}}$$

\zeta(2)=\sum_{n=1}^{\infty}\frac{1}{n^2}=\prod_{p:prime}\frac{1}{1-\frac{1}{p^2}}

Jupyter Notebook+WordPress+MarsEdit

Jupyter Notebook hoge.ipynbをWordPressに貼り付ける手順

準備 外観→追加CSSに以下を追記

Web上にはいくつかのCSSが見つかる
その中から選んだCSS
https://andrewchallis.co.uk/articles/php-nbconvert-a-wordpress-plugin-for-jupyter-notebooks/

************** Jupyter Notebook CSS ************************/
div .dataframe {
  border:none;
  margin: 0 auto;
}
div.output_stdout pre {
  max-height:300px;
}

div.output_stderr pre
{
  background: #fdd;
  margin:0;
  max-height:300px;
}
div.hl-ipython3 pre {
  margin:0
}
.dataframe thead tr:only-child th {
  text-align: right;
  text-transform: capitalize;
}
.dataframe thead th {
  text-align: left;
}
.dataframe tbody tr th {
  vertical-align: top;
}

.rendered_html tbody tr:nth-child(odd),
.rendered_html tbody tr:nth-child(odd) td {
  background: #f5f5f5;
}
.rendered_html tr, .rendered_html th, .rendered_html td {
  text-align: right;
  vertical-align: middle;
  padding: 0.5em 0.5em;
  line-height: normal;
  white-space: normal;
  max-width: none;
  border: none;
}
div.highlight .kn, .n, .k, .nn, .s1, .ow, .p, .mi, .c, .mf, .nb, .kc, .sd, .nf {
  font-family: monospace;
  font-size:14px;
}
.input_prompt {
  color: #303F9F;
  font-weight: bold;
  float: left;
  margin-right: 5px;
  margin-top: 3px;
}
.input_area pre {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
  padding: 6px 3px 6px 6px;
}
.output_prompt{
  color:#cc0000;
  font-weight: bold;
}
.prompt{
  font-family: monospace;
  font-size: 14px;
}
.c, c1 {
  color: #408080;
  font-style: italic;
}
.k {
  color: #338822;
  font-weight: bold;
}
.kn {
  color: #338822;
  font-weight: bold;
}
.mi {
  color: #008800;
}
.mf {
  color: #008800;
}
.o {
  color: #9966ff;
}
.ow {
  color: #BA22FF;
  font-weight: bold;
}
.nb {
  color: #338822;
}
.n {
  color: #000000;
}
.s, .s1, .sd, .s2 {
  color: #cc2222;
}
.se {
  color: #cc2222;
  font-weight: bold;
}
.si {
  color: #C06688;
  font-weight: bold;
}
.nn {
  color: #4D00FF;
  font-weight: bold;
}
.output_area pre {
  background-color: #FFFFFF;
  padding-left: 5%;
}
.code_cell {
  padding-left: 1%;
}
.cell {
  margin-top: 10px;
  margin-bottom: 10px;
}
br {
  line-height: 2;
}
blockquote {
  font-size: 1em;
  text-align: left;
  font-weight: normal;
}
code {
  border: none;
  box-shadow: none;
  font-family: monospace;
}
div.rendered_html h1, h2, h3, h4 {
  margin-top: 30px;
  margin-bottom: 10px;
}
div.rendered_html p a {
  color: #4D00FF;
}

スクリーンショット 165

1. hoge.ipynb から hoge.html を生成

$ jupyter nbconvert --to html --template basic hoge.ipynb
[NbConvertApp] Converting notebook hoge.ipynb to html
[NbConvertApp] Writing 5129 bytes to hoge.html

2. hoge.html の中身をMarsEditにコピー

ここでhoge.htmlをWORDPRESSエディター上カスタムHTMLにコピーする方法を試してみると、TeXコード部分が変換されずそのままで表示されてしまう。

出力

In [12]:
# フィボナッチ数列の一般項 F_n
# F_0 = 0,  F_1 = 1
# F_{n+2} = F_n + F_{n+1} n=0,1,2,...
In [13]:
import sympy
sympy.init_printing()
sympy.var("n")
A = sympy.Matrix([[1, 1],[1, 0]])
f1 = sympy.Matrix([1, 0])
Fn = sympy.simplify(A**(n-1)*f1)
display(Fn)
print("F_n =")
display(Fn[0,0])  # F_n = Fn[0,0]
\displaystyle \left[\begin{matrix}\frac{2^{- n} \left(- \left(1 – \sqrt{5}\right)^{n} + \frac{2 \sqrt{5} \left(1 – \sqrt{5}\right)^{n}}{5} – \frac{2 \sqrt{5} \left(1 + \sqrt{5}\right)^{n}}{5} + \left(1 + \sqrt{5}\right)^{n}\right)}{-2 + \sqrt{5}}\\- \frac{2 \sqrt{5} \left(1 – \sqrt{5}\right)^{n}}{5 \left(- 2^{n} \sqrt{5} + 2^{n}\right)} + \frac{2 \sqrt{5} \left(1 + \sqrt{5}\right)^{n}}{5 \left(2^{n} + 2^{n} \sqrt{5}\right)}\end{matrix}\right]
F_n =
\displaystyle \frac{2^{- n} \left(- \left(1 – \sqrt{5}\right)^{n} + \frac{2 \sqrt{5} \left(1 – \sqrt{5}\right)^{n}}{5} – \frac{2 \sqrt{5} \left(1 + \sqrt{5}\right)^{n}}{5} + \left(1 + \sqrt{5}\right)^{n}\right)}{-2 + \sqrt{5}}
In [14]:
for i in range(10):
    print(int(Fn[0,0].subs(n, i)))
0
1
1
2
3
5
8
13
21
34
In [ ]:
 

MacPro2009でTnsorflow+Kerasを使う

私のメインマシンはMacPro2009
拡張性の大きさから10年以上現役バリバリ
M1MacBook Proはサブ
他に
MacBook Pro Late 2013
MacBook Air Mid 2012
Dell OPTIPLEX 3020(Ubuntuメイン+NAS)
HP EliteBook 820(SSD分割Ubuntu+Win10)
東芝DynaBook T350(win7)
Macpc 001
これだけのマシンを駆使して
桜井進のPython・UNIX教室で使うUSBメモリーブートUbuntuシステムを作成できます
本当はテスト用に2016年〜2020年のMacBook Proが欲しい

さて本題
これらのマシンにPythonの実行環境がある
Pythonのバージョンメンテナンスで面倒なのがTensorFlow
それぞれのマシンで動くバージョンが違う(CPU、GPUの性能に異存)
Tensorflowのインストールだけでも手間がかかるのに
異存するライブラリのバージョンも関係するのでさらに面倒

なかでもメインマシンMacPro2009(10.15.6)はCPUが古いので
新しいTensorFlowは入らない
それでもTesorFlow 1.5.0なら動くことがわかった

ところが、
そこに画像認識をさせようとKerasを動かそうとするとこれが中々動いてくれない

試行錯誤の末、ようやくTnsorflow+Kerasが動く組合せを見つけた

Macにはpyenvを使ってPythonをインストール
これでPythonのバージョンを自在にコントロールできる
Python 3.6.5のインストール

$ pyenv install --list
$ pyenv install 3.6.5
$ pyenv global 3.6.5
$ pyenv rehash

同様にPython 3.6.6のインストールすると
次のように異なるバージョンのスイッチングが簡単にできて便利

$ pyenv versions
  system
* 3.6.5 (set by /Users/sakuraisusumu/.pyenv/version)
  3.6.6

TensorFlow 1.5.0 インストール

$ python -m pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.5.0-py3-none-any.whl

組合せその1
Python 3.6.6
TensorFlow 1.5.0
keras 2.6.0(最新)

TensorFlow OK
Tnsorflow+Keras NG

組合せその2
Python 3.6.6
TensorFlow 1.5.0
keras 2.4.3(2.3.0、2.2.1)

TensorFlow OK
Tnsorflow+Keras NG

組合せその3
Python 3.6.5
TensorFlow 1.5.0
keras 2.2.1

TensorFlow OK
Tnsorflow+Keras OK

これでMacPro2009でもTnsorflow+Keraを使った画像認識ができるようになった
本当に微妙なバージョン違いです

$ python ai.py cat.jpg
Using TensorFlow backend.
2021-09-17 03:28:56.088497: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.2

keras+TensorFlowによる画像認識結果
                     確率
           tabby     71.12%
    Egyptian_cat     14.72%
       tiger_cat     10.62%
        radiator     0.55%
         doormat     0.27%

桜井進のPython・UNIX教室(入門コース全3回Zoom)の第3回授業風景
Dell OPTIPLEX 3020(Ubuntuメイン+NAS)でTnsorflow+Keraを使った画像認識を実行しているところ
スクリーンショット 66

MacOS Pythonにpytest インストール

$ python -m pip install pytest

インストールできたものの

$ pytest
zsh: command not found: pytest

あれれ?

$ which pytest
$ whereis pytest

だめだ、見つからない!
そこで一旦アンインストールすることに

$ python -m pip uninstall pytest
Found existing installation: pytest 6.2.4
Uninstalling pytest-6.2.4:
  Would remove:
    /Users/sakuraisusumu/.local/bin/py.test
    /Users/sakuraisusumu/.local/bin/pytest
    /Users/sakuraisusumu/.local/lib/python3.6/site-packages/_pytest/*
    /Users/sakuraisusumu/.local/lib/python3.6/site-packages/pytest-6.2.4.dist-info/*
    /Users/sakuraisusumu/.local/lib/python3.6/site-packages/pytest/*
Proceed (Y/n)? 

ここでようやくpytestの場所が判明
さっそく.zprofileにPATHを通してOK

解決問題「コラッツ・角谷予想」(後半)

空間情報連載
Pythonで数学を学ぼう!

桜井進のPython+Math教室 第9回

Pythonで数論!未解決問題「コラッツ・角谷予想」(後半)
1.コラッツ予想

2.コラッツ・シークエンスのステップ数
コラッツ・シークエンスのステップ数を求めるコード

# colg.py
# ステップ数(最大ステップ数)と頻度のグラフ描画
import numpy as np                  # 配列を扱う数値計算ライブラリNumPy
import matplotlib.pyplot as plt     # グラフ描画ライブラリmatplotlib
import japanize_matplotlib          # matplotlibの日本語化
import datetime as dt
from decimal import Decimal

while(1):
  Model = input('1.a≦n≦bに対するコラッツ・シークエンスのステップ数の最大値とnを算出\r\n'
                '2.a≦n≦bに対する横軸ステップ数、縦軸頻度の棒グラフ描画\r\n'
                '1、2のどれかを入力 ')
  if Model.isdecimal():
    Model = int(Model)
    if 1 <= Model <= 2:
      break