弱形から強形を導く先にも述べたが、どうやら弱形から強形を導くことも出来るらしい。trickなる技を使うようだ[5]。Wikipediaの記事を見てみると、そのまんま本[1]に書いてある強形の証明だった。初等的な式変形で証明出来るため、興味がある方はご覧頂くと良いだろう。強形を導くためのものに見える。強形を導くことは出来なさそうだ。先に述べた通り2つの弱形は同値なので、あまり気にする必要はない。結局、強弱とは何なのか?強形から弱形、弱形から強形をそれぞれ証明出来たのだから、両者は同値であると言える。それであればなぜ強とか弱とか名前が付いているのか疑問だが、そこまでは分からなかった。少なくとも見た目だけでも強形が弱形の一般化っぽく見えていればまだ納得できるが、両者の主張にはどうも統一感がない。見ぬ同値なステートメントがあるのかも知れない。まとめ本稿ではHilbertの零点定理について調べた。この定理には強形、弱形と呼ばれるバリエーションが存在するが、名前に反してそれらは同値であることを明らかにした。Hilbertの零点定理は以前より名前だけは聞いたことがあり、どんな定理か気になっていた。本稿の執筆を通してそこそこ理解できて嬉しい。修士の学位は得られた。~Nullstellensatzの強形と弱形~Tweet広告を非表示にするもっと読むコメントを書く2020-01-0116進数から10進数への変換を概算で求める私はソフトウェア開発という仕事柄、日常的に16進数を扱っているのだが、16進数を10進数に変換したくなることがよくある。これはWindowsの電卓機能で簡単に実現できるためどうということはないのだが、もしこの変換を暗算で高速に行えると良いと思うことがある。10進数と16進数というのは相性がよくない。どちらも2のべき乗であればまだ何とかなったと思うのだが、人類が10進数などというわけのわからない表記を好んで使うものだから、誤差なく簡単に変換することは不可能と思われる。ここで言う「簡単に」というのは、変換したい16進数をマウスでコピーし、Windowsの電卓アプリを開き値をペーストするよりも手軽に、という意味であると定義しておく。そこで本稿では概算によりこの16進数から10進数への変換を簡単に行える方法について説明する。概算によってどれくらいの誤差が生じ得るかについても調べる。概算のステップは大きく以下の2つに分けて考える。桁上げ1点目について、概算の仕方として以下の3つの方法を考える。ある桁以下の値を切り捨てる。ある桁の数を7捨8入する。16のどれかに丸める。上の方法ほど計算は簡単だが誤差が大きく、下の方法ほど計算は複雑だが誤差は小さくなる。3つ目の方法について補足しておく。するとか、そういう方法である。16のうちどれに丸めるかというのは選択の余地がある。その後、0となった下位の桁の分だけ桁上げの計算を行う必要がある。計算すると、10進数への概算による変換が完了する。この計算を愚直に実行すると暗算では厳しいため、これについても概算による単純化を試みる。8byteの整数値を16進数として表現することが考えられる。8byteはさすがに大きすぎて暗算では厳しそうなので、2byteの16進整数を必須の対象とし、4byteを努力目標とする。切り捨て前述した3つの方法のうち、もし切り捨てで話が簡単になるならそれほど嬉しいことはない。楽観的にこの方針について調べてみよう。最悪ケースでの誤差まず、上位から3桁目以降を切り捨てた場合の誤差について考えてみる。この場合、最も切り捨てによる誤差が大きくなるのは、残された上位2桁が最小で、切り捨てられる3桁目以降が最大になる時、つまり0x10ff...fである。これの3桁目以降を切り捨てた値は0x1000...0となる。この場合の誤差は以下のように計算できる。これより、3桁目以降を切り捨てた場合の誤差は約6%以下であり、この程度であれば無視してしまってもよいだろう。よって概算を考える上では、上位2桁だけを考えればよいと言える。次に、上位から2桁目以降を切り捨てた場合の誤差について考えてみる。この場合、先ほどと同様に考えて、最も切り捨てによる誤差が大きくなるのは0x1ff...fである。これの2桁目以降を切り捨てた値は0x100...0となる。この場合の誤差は以下のように計算できる。これより、2桁目以降を切り捨てた場合の誤差は約52%以下である。2桁目の値を無視するのは誤差が大きくなりすぎるようだ。上位2桁をそのまま残す必要があるとなると、暗算が苦手な私としては電卓を使いたくなる。そこで、誤差を減らすために2桁目を7捨8入することを考えてみよう。最悪ケースでの誤差7捨8入の場合、切り捨てる場合と切り上げる場合の誤差についてそれぞれ考える必要がある。切り捨てる場合の誤差について考えてみる。この場合、誤差が最も大きくなるのは0x17ff...fである。これの2桁目を7捨8入した値は0x1000...0となる。この場合の誤差は以下のように計算できる。これより、2桁目を7捨8入により切り捨てた場合の誤差は約35%以下となる。次に、切り上げる場合の誤差について考えてみる。この場合、誤差が最も大きくなるのは0x1800...0である。これの2桁目を7捨8入した値は0x2000...0となる。この場合の誤差は以下のように計算できる。これより、2桁目を7捨8入により切り捨てた場合の誤差は約33%以下となる。切り捨てと切り上げの結果をまとめると、誤差は約35%以下と言える。先ほどよりは誤差を削減することができた。1桁目がfの場合の切り上げ1桁目がfの場合、2桁目を切り上げるとさらに桁上がりが発生してしまう。言って特に後の計算に変化はない。このケースについては後述する具体例の中でも取り上げる。16に丸める際の誤差7捨8入によってある程度誤差を小さくできたが、1桁目の値が小さいとまだ誤差が大きい。16のどれかに丸める方法を考えてみよう。16のどれに丸めるかを決めておく必要がある。できるだけ自然なルールにすることが望ましい。そこで、本稿では以下のように丸め方を決める。上位2桁の値を2倍する。