2026年4月15日水曜日

クロポトキンのパン略について教えてください

 クロポトキンの「パン略」については、以下のような内容が関連する可能性があります。

クロポトキンと「パン略」

クロポトキン(Peter Kropotkin, 1842–1921)は、ロシア出身の地理学者であり、無政府主義の思想家です。彼の代表的な著書『パンの略取(The Conquest of Bread)』は、労働者階級や資本主義の問題を分析し、無政府共産主義のビジョンを描いた作品です。この本では、資本主義経済の矛盾を批判し、労働者が自らの生産物を管理し、平等な社会を築く方法を提案しています。

『パンの略取』の主な内容

  1. 生産物の共有

現代社会の問題は、生産物の分配にあると指摘。

資本主義は少数の資本家が生産物を支配する仕組みであるため、これを打破し、生産物を全ての人々で共有すべきと主張。

  1. 無政府共産主義の提案

強制力のある国家や資本主義を否定し、自由で平等な社会を構築することを目指す。

個々人の自由を尊重しつつ、必要なものを必要とする人に分配する「相互扶助」の思想を提唱。

  1. 相互扶助と生産の自律性

『相互扶助論』(Mutual Aid)に基づき、人類は協力によって進化し、より良い社会を築けると主張。

生産手段を自治的なコミュニティで管理することで、より効率的で公平な社会を実現するとした。

  1. 社会の再編

労働時間の短縮や、教育と技術革新による生産性向上を提案。

すべての人が必要な物資を自由に利用できる社会を理想とした。

「パン略」という言葉の意味

「パン略」は、『パンの略取』の日本語訳で使われる場合が多いです。この表現は、クロポトキンが唱えた「社会的な略奪」ではなく、「既存の不平等を是正し、人々に平等に分配する」という積極的な行動を表しています。

もし特定の文脈で使われている場合、さらに具体的な説明が必要かもしれませんので、詳細を教えていただければ補足します。

略取とは搾取の意味ですか?

いいえ、**「略取」と「搾取」**は異なる意味を持つ言葉です。

略取の意味

「略取」という言葉は、もともと「奪い取る」ことを指します。ただし、『パンの略取』においては、単純に暴力的・強制的に奪うことではなく、既存の不平等な所有や支配を否定し、正当な形で資源や生産物をすべての人々が共有することを意味しています。

クロポトキンが『パンの略取』で使った「略取」という表現は、資本主義社会の不平等を是正し、資源や財産を少数者からすべての人に解放するというニュアンスを含んでいます。このため、**「再分配」や「共有」**という意図が強いです。


搾取の意味

一方、**「搾取」**は主に以下のような意味で使われます:

  1. 他人の労働や成果を不当に利用すること。

例:労働者が働いて得た価値の多くを資本家が取る。

  1. 力の差を利用して利益を得ること。

例:権力や資本を持つ者が弱い立場の者を支配し、不利益を押し付ける。

搾取は資本主義の仕組みにおいて、特に労働者階級から富が奪われる不公正な行為を指すため、クロポトキンの批判の対象です。


両者の違い


クロポトキンが批判したのは、資本主義における「搾取」の構造であり、それに対抗するために「略取」を通じた平等な社会の実現を訴えたのです。

クロポトキンもロンドン滞在中に**大英図書館(British Library)**を頻繁に利用していました。クロポトキンが大英図書館で研究したことは、彼の思想や著作に大きな影響を与えたとされています。


クロポトキンと大英図書館

  1. 滞在時期

クロポトキンは19世紀末にロンドンに亡命し、大英図書館を利用して多くの資料を調査しました。

特に地理学や経済学、社会学、自然科学に関する資料を精力的に読みました。

  1. 研究対象

地理学と進化論:

クロポトキンは、地理学者としての専門知識を活かし、大英図書館で自然界や人類の進化に関する資料を調査しました。

特にダーウィンの進化論やトマス・ロバート・マルサスの著作を読み、独自の批判を展開しました。

社会学と歴史:

社会の形成過程や相互扶助に関する歴史的記録を深く研究し、『相互扶助論』(Mutual Aid)に反映させています。

  1. 大英図書館の影響

クロポトキンは、相互扶助の思想を大英図書館での研究を通じて深めました。彼は、生物学だけでなく、歴史的なコミュニティや集団行動を調べ、これが進化と共存において重要な役割を果たすという考えを発展させました。

資本主義の批判や、分配の平等を目指す無政府共産主義の提案も、大英図書館での研究成果が基盤になっています。


大英図書館とマルクス

この点で、クロポトキンの活動はマルクスとも共通点があります。マルクスも大英図書館を拠点にし、『資本論』を執筆するために膨大な資料を研究しました。


歴史的な影響

クロポトキンの思想は、彼が大英図書館で得た知識によってさらに洗練され、無政府主義の理論と実践を深めることにつながりました。彼の大英図書館での研究活動は、後に彼の著書『相互扶助論』や『パンの略取』に結実し、20世紀初頭の無政府主義運動に影響を与えました。

エピポーラ幾何の仕様

 エピポーラ幾何は、ステレオ画像や2つの異なる視点からの画像の対応関係を理解するための幾何学的なフレームワークを提供します。この概念は、特にコンピュータビジョンや3D再構築などの分野で重要です。

以下、エピポーラ幾何の主要な要点を説明します:

  1. エピポーラ線(Epipolar Lines): 一方の画像上の任意の点に対して、もう一方の画像上の対応する点が存在するエピポーラ線上になります。これは、カメラの中心を結ぶ線上に存在することが保証されています。

  2. エピセンタ(Epipole): 2つのカメラの焦点(中心)を結ぶ線が各画像面と交わる点。すべてのエピポーラ線はこの点を通過します。

  3. 基本行列(Fundamental Matrix): 一方の画像上の点ともう一方の画像上のエピポーラ線との関係を示す3x3の行列。この行列を使用すると、一方の画像の点からもう一方のエピポーラ線を計算できます。

  4. エッセンシャル行列(Essential Matrix): 基本行列と似ていますが、カメラの内部パラメータによってスケールされています。これは、カメラの相対的な姿勢と位置関係のみを示しています。

エピポーラ幾何は、2つのビュー間の点の対応を見つけることを助けるために使用されます。これは、3Dの点を再構築するための基盤となります。また、この幾何学的な制約を利用して、一方の画像上の点からもう一方の画像上の対応点を効率的に検索することができます。

ピンホールカメラで画像を撮影する場合、画像の奥行きという重要な情報が失われます。つまり、3次元から2次元への変換なので、画像内の各点がカメラからどれくらい離れているかという情報が失われます。そこで、このようなカメラを使って奥行き情報を得られるかどうかが重要な問題になります。その答えは、「複数のカメラを使うこと」です。私たちの目も同じように、2台のカメラ(2眼)を使う仕組みになっており、これをステレオビジョンと呼びます。

https://docs.opencv.org/4.x/da/de9/tutorial_py_epipolar_geometry.html
画像
https://amzn.to/3RyVUgA
画像
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Epipolar_geometry.svg

左のカメラだけだと、線分OX上のすべての点が画像平面上の同じ点に投影されるため、画像上の点xに対応する3次元点を見つけることができません。しかし、右の画像も考えてみましょう。今度は、線分OX上の異なる点は、右平面上の異なる点(x′)に投影されます。つまり、この2つの画像を使って、正しい3次元点を三角測量することができるのです。

画像
他の画像で一致する点を見つけるには、画像全体を検索する必要はなく、エピラインに沿って検索すればよいのです。そのため、性能と精度が向上します)。これをエピポーラ制約と呼びます。同様に、すべての点は、もう一方の画像に対応するエピラインを持つことになります。平面XOO′はエピポーラ平面と呼ばれる。

レイマーチングより低コストになるようだ

霧や霞のような参加型メディアにおける散乱は、クレパス光線や神光線と呼ばれるボリューム感のある照明効果を生成します。このような効果のレンダリングは、仮想シーンのリアリズムを大きく向上させますが、散乱現象が空間内のすべての点で発生するため、本質的にコストがかかり、観察者に向かって散乱した光の高価な統合を必要とします。これは通常、レイマーチングを用いて行われるが、インタラクティブなアプリケーションでは画面上のすべてのピクセルに対してコストがかかりすぎる。我々は、単一散乱媒体のテクスチャ光源のためのレンダリング技術を提案する。これは、エピポーラ幾何学の概念から、画像空間にサンプルを配置するもので、散乱光はクレプス光線に直交して変化するが、ほとんどはこれらの光線に沿って滑らかに変化する。これらは、画像平面上の1本の線に投影される光線平面のエピポーラ線である。本手法は、エピポーラ線に沿って疎にサンプリングし、適切なところでサンプル間を補間するが、光線の影に起因する高い周波数のディテールを保持する。本手法はGPUへの実装が非常に簡単であり、高画質な画像を生成し、高いフレームレートを達成することができることを示す。

https://dl.acm.org/doi/10.1145/1730804.1730823

📈10年後にif文は消滅する?

 かつてgoto文という命令が隆盛していたが、70年代から衰退しはじめた

「構造化プログラミング」を提唱していたコンピュータ科学者らの一人であったダイクストラは、1968年にGo To Statement Considered Harmful(「Go To 文は有害(Harmful)とみなされる」)という刺激的な記事を国際学会ACMの学会誌Communications of the ACMに投稿し(ただし、本人が付けたタイトルはA Case Against the Goto Statementという穏便なもので、少なくともタイトルの過激さと、レターとして発表を急いだことは、編集を担当していたヴィルトによるものである)

「goto文、いかがなものか」と言われ始めたのは68年で、ダイクストラのせいではないだろうが今goto文について意識する人は少なくなっていると思う。いまやgotoを使うためにはラベルが必要になっている。

ダイクストラが有名だが、その前に物申した人もいたようだ。

1959 年に開催されたpre-Algolの会議で、ハインツ・ゼマネクは GOTO文の必要性について明確に疑念を投げかけたが、後に GOTO の象徴的な反対者となったエドガー・W・ダイクストラを含め、当時は誰も彼の発言に注意を払わなかった。

ALGOLはgotoが不要そうなしくみになっていそう。ここまでコンテンポラリーだとなぜ廃れたかの方が気になる。

https://www.tutorialspoint.com/execute_algol_online.php

ALGOLはこちらで試運転できる。コードはrosetta codeでいくつか読んでみよう。

PROC gcd = (INT a, b) INT: (
 IF a = 0 THEN
   b
 ELIF b = 0 THEN
   a
 ELIF a > b  THEN
   gcd(b, a MOD b)
 ELSE
   gcd(a, b MOD a)
 FI     
);
test:(
 INT a = 33, b = 77;
 printf(($x"The gcd of"g" and "g" is "gl$,a,b,gcd(a,b)));
 INT c = 49865, d = 69811;
 printf(($x"The gcd of"g" and "g" is "gl$,c,d,gcd(c,d)))
)

ALGOL68でGCD(最大公約数)を求めるサンプルだが、wikipediaの説明通り、再帰を使っている風な感じがかいまみえる。PROCというキーワードがプロシージャー(命令のまとまり)の宣言に違いない。

60年代に構造化のブームがあった

原爆が広島に落ちてナチの時代が終わり、冷戦をむかえながら、ベトナム戦争の時代に突入するときに、哲学では実存が叫ばれたあとに構造主義のブームがあった。Structuralismというブームは哲学にもあって、プログラムもALGOLを皮切りにStructuredというブームが起こった。ここでgoto文は実存主義みたいなものだ。

構造主義が台頭しはじめると、次第にサルトルの実存主義は「主体偏重の思想である」として批判の対象になる。とりわけクロード・レヴィ=ストロースが、1962年の『野生の思考』の最終章「歴史と弁証法」において行ったサルトル批判は痛烈なものであった。

スパゲティプログラム

サルトルがどれぐらい混乱を招くかわからないが、gotoはスパゲティプログラムを引き起こすと一般には知られている。(要出典)

Linuxの生みの親リーナス先生の冒頭にもgoto文が出てきた。無限ループの世界へようこそ。

関数型の隆盛

関数型は古くからあるが、マシンスペックの向上によりだいぶ普及してきた。オブザーバーを代表するMVCなどのデザインパターンがかつてのFORTRANやCOBOLになりつつあるのかもしれない。。。


Goto文の衰退の整理

  1. プログラムの可読性の低下:

    • Goto文は、プログラムのフローを追跡するのが難しく、可読性を著しく低下させます。コードがスパゲッティ化し、バグの発見や修正が困難になります。

  2. 構造化プログラミングの台頭:

    • 1970年代にエドガー・ダイクストラが「Goto文の使用は有害である」と述べ、構造化プログラミングが広まりました。このプログラミングパラダイムは、ループや条件分岐などの制御構造を使うことで、コードの明瞭性と保守性を向上させました。

  3. 言語の進化:

    • 近代的なプログラミング言語(例:C、Java、Pythonなど)は、Goto文を使用せずに制御フローを管理するための高度な構造を提供しています。これにより、Goto文の必要性が減少しました。

  4. メンテナンスの容易さ:

    • Goto文を避けることで、コードのメンテナンスが容易になり、プログラムの品質が向上します。特に大規模なプロジェクトでは、構造化されたコードがチームでの協力作業を円滑にします。

if文の衰退シナリオ

  1. 関数型プログラミングの普及:

    • 関数型プログラミングでは、if文の代わりにパターンマッチングや高階関数を使用することが推奨されます。これにより、コードの明確さと予測可能性が向上します。

  2. 代替構造の採用:

    • 三項演算子(条件演算子)やスイッチ文、さらにはマッチング構文(例:RustやScalaのmatch文)など、if文の代替となる制御構造が広まりつつあります。

  3. デザインパターンの活用:

    • 状態パターンやストラテジーパターンなどのデザインパターンを使用することで、条件分岐をオブジェクト指向的に処理することが可能になります。これにより、if文を減らし、コードの保守性を向上させることができます。

  4. ドメイン特化言語(DSL)の利用:

    • 特定のタスクやドメインに特化したDSLでは、条件分岐を簡潔に表現できる構文が用意されていることが多く、if文の使用が不要になる場合があります。

まとめ

Goto文の衰退は、プログラムの可読性と保守性を重視する構造化プログラミングの普及によるものであり、言語の進化によってもたらされました。一方、if文の衰退シナリオは、関数型プログラミングの普及や代替構造の採用、デザインパターンの活用などによって進行する可能性があります。これらの進化は、より明確で保守しやすいコードを作成するためのものです。



2026年4月14日火曜日

アダマール変換の仕様

 アダマール変換(Hadamard Transform)は、離散フーリエ変換やラプラス変換などと同様に、信号処理やデータ解析で広く利用される数学的変換です。アダマール変換は、行列を用いて実行される変換で、バイナリ関数を特定の形式で変換します。アダマール行列は、再帰的に定義される特殊な正方行列で、各エントリは+1または-1です。

アダマール変換をJavaScriptで実装する場合、以下のようなコードになります。

/**
 * Generate Hadamard matrix of size n (must be a power of 2)
 * @param {number} n
 * @returns {number[][]}
 */
function generateHadamardMatrix(n) {
    if (n === 1) {
        return [[1]];
    }
    
    const smallerMatrix = generateHadamardMatrix(n / 2);
    const top = smallerMatrix.map(row => row.concat(row));
    const bottom = smallerMatrix.map(row => row.concat(row.map(x => -x)));
    
    return top.concat(bottom);
}

/**
 * Perform Hadamard transform on a vector
 * @param {number[]} vector
 * @returns {number[]}
 */
function hadamardTransform(vector) {
    const n = vector.length;
    const hadamardMatrix = generateHadamardMatrix(n);
    
    // Matrix-vector multiplication
    const transformed = new Array(n).fill(0);
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            transformed[i] += hadamardMatrix[i][j] * vector[j];
        }
    }
    
    return transformed;
}

// Example usage:
const inputVector = [1, 1, 1, 1]; // Example input vector
const transformedVector = hadamardTransform(inputVector);
console.log(transformedVector); // Output the transformed vector

このコードでは、以下のステップを踏んでいます:

  1. `generateHadamardMatrix`関数でアダマール行列を生成します。この関数は、指定されたサイズのアダマール行列を再帰的に構築します。サイズは2のべき乗である必要があります。

  2. `hadamardTransform`関数でアダマール変換を実行します。これは、入力ベクトルとアダマール行列を掛け合わせることで行われます。

  3. 最後に、例として、入力ベクトル `[1, 1, 1, 1]` をアダマール変換し、その結果を出力しています。

この実装は、基本的なアダマール変換の概念を示しており、入力ベクトルの長さが2のべき乗であることを前提としています。実際の使用においては、入力データの前処理や最適化が必要になる場合があります。



アダマール変換とアフィン変換の主な違いは、アダマール変換が2値の集合に作用する線形変換であるのに対し、アフィン変換は空間内の点の集合に作用する幾何学的変換であることである。

アダマール変換とアフィン変換について、日本語の擬似コードで説明します。

アダマール変換の擬似コード

アダマール変換は、データのセットに対して行われる線形変換で、主に画像処理や信号処理に用いられます。

関数 アダマール変換(A)
    n = Aの行数  // Aは2^k x 2^kのサイズの正方行列と仮定
    もし n == 1 なら
        返す A
    そうでなければ
        A上左 = A[1:n/2, 1:n/2]
        A上右 = A[1:n/2, n/2+1:n]
        A下左 = A[n/2+1:n, 1:n/2]
        A下右 = A[n/2+1:n, n/2+1:n]

        // サブ行列に対する再帰呼び出し
        H上左 = アダマール変換(A上左)
        H上右 = アダマール変換(A上右)
        H下左 = アダマール変換(A下左)
        H下右 = アダマール変換(A下右)

        // 結果の組み合わせ
        上行 = H上左 + H上右, H上左 - H上右
        下行 = H下左 + H下右, H下左 - H下右
        結合して返す(上行, 下行)

アフィン変換の擬似コード

アフィン変換は、スケーリング、回転、平行移動を組み合わせた幾何学的な変換を指します。

関数 アフィン変換(点群, 変換行列)
    変換された点群 = []
    点群に対して繰り返し
        // 点は列ベクトル [x, y, 1]^Tと仮定
        変換された点 = 変換行列 * 点
        変換された点群に追加(変換された点)
    返す 変換された点群

ここでの `変換行列` はアフィン変換を行うための行列で、一般的には次の形式です:

[ a  b  tx ]
[ c  d  ty ]
[ 0  0  1  ]

この行列において、`a, b, c, d` はスケーリングや回転を制御し、`tx, ty` は平行移動を制御します。

アダマール変換は、信号処理、画像処理、データ圧縮でよく使われる線形直交変換です。アダマール行列をベースにしており、この行列は要素が+1または-1のいずれかからなる行列です。アダマール変換は、データベクトルとアダマール行列を掛け合わせることでデータに適用され、変換されたベクトルを得ることができます。誤り訂正符号、JPEGなどの画像圧縮、離散フーリエ変換の高速計算アルゴリズムなどの分野で応用されています。

アフィン変換は、画像処理、コンピュータグラフィックス、幾何学でよく使われる、線形変換の後に並進を行う変換です。並進、拡大縮小、回転、スキュー(せん断)など様々な変換を表現することができます。変換は、行列の乗算とそれに続くベクトルの加算で表現されます。アフィン変換は、共線性(同じ線上にある点は同じ線上に残る)と点間の距離の比(実際の距離そのものである必要はない)を保持します。

アダマール変換はアダマール行列に基づく直交変換であり、アフィン変換は線形変換の後に並進を行うものである。
アダマール変換は主に信号処理、画像処理、データ圧縮で使用され、アフィン変換は画像処理、コンピュータグラフィックス、幾何学で使用されます。
アダマール変換はデータのベクトルや行列を扱い、アフィン変換は点、線、図形を、並進、拡大縮小、回転、傾きなどの変換の文脈で扱います。

この表に示した例では、簡略化された3つの方程式スキームを使用しており、4つの分類群ツリーをnewickフォーマットで((A,B),(C,D))と書くことができる。サイトパターンはABCDの順序で書かれている。この特定のツリーは、2つの長い終端枝(部位あたり0.2転置)、2つの短い終端枝(部位あたり0.025転置)、短い内部枝(部位あたり0.025転置)を持つ。したがって、newickフォーマットでは、((A:0.025,B:0.2):0.025,(C:0.025,D:0.2))と書かれる。

https://en.wikipedia.org/wiki/Hadamard_transform

アフィン変換行列は、直線の "直線性 "と "平行度 "を保持する2次元座標から他の2次元座標への線形マッピングを行う。
このような座標変換は、3行×3列の行列で表すことができ、最後の行は [ 0 0 1 ] である。この行列は、元座標(x,y)を列ベクトルとみなし、以下の処理に従って座標ベクトルに行列を乗じることで、元座標(x,y)を先座標(x',y')に変換する:

http://paperjs.org/reference/matrix/

行列で表現できるのは線形変換だけではない。n次元ユークリッド空間Rn上の非線形変換の中には、n+1次元空間Rn+1上の線形変換として表現できるものがある。これにはアフィン変換(平行移動など)と射影変換の両方が含まれる。このため、3次元コンピュータグラフィックスでは、4×4の変換行列が広く用いられている。これらのn+1次元変換行列は、その用途に応じて、アフィン変換行列、射影変換行列、またはより一般的には非線形変換行列と呼ばれます。n次元行列に関して、n+1次元行列は補強行列として記述することができる。

https://en.wikipedia.org/wiki/Transformation_matrix

アフィン変換と線形変換は、幾何学において重要な変換の種類ですが、それぞれ異なる特徴を持っています。

線形変換

線形変換は、ベクトル空間内のあるベクトルを別のベクトルにマッピングする関数です。この変換は、スケーリング(拡大縮小)、回転、反射(鏡映)などを含みます。線形変換の重要な性質は以下の通りです:

  1. 原点の保持: 線形変換では、原点は常に原点にマッピングされます。

  2. 加法性と斉次性: 線形変換 T に対して、任意のベクトル u と v、およびスカラー a に対して、T(au+v)=aT(u)+T(v) が成立します。

  3. 行列による表現: 任意の線形変換は行列によって表すことができます。

アフィン変換

アフィン変換は、線形変換の概念を拡張し、平行移動(移動)も含むようにしたものです。アフィン変換は、回転、スケーリング、反射、せん断(歪み)、移動などの変換を組み合わせることができます。アフィン変換の特徴は以下の通りです:

  1. 原点の非保持: アフィン変換では、原点が別の点に移動することがあります。

  2. 平行性の保持: アフィン変換は直線の平行性を保持しますが、角度や長さは必ずしも保持しません。

  3. 拡張行列による表現: アフィン変換は拡張行列(通常は行列の最後に列を追加して平行移動を表現)を用いて表されます。

アダマール変換は、画像処理において特定のアプリケーションで使用されることがあります。アダマール変換は、画像データの分析や圧縮、ノイズ除去などに応用されることがあります。ただし、より一般的な画像変換手法と比べると、その使用は限定的です。

import cv2
import numpy as np
from scipy.linalg import hadamard

# 画像をグレースケールで読み込み
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)

# アダマール変換を適用するためには、画像サイズが2のべき乗である必要があります。
# この例では、画像サイズを256x256にリサイズします。
image = cv2.resize(image, (256, 256))

# アダマール行列を生成
H = hadamard(256)

# アダマール変換を実行
transformed = H.dot(image).dot(H)

# 変換された画像を表示(または保存)
cv2.imshow('Hadamard Transformed', transformed)
cv2.waitKey(0)
cv2.destroyAllWindows()