トポロジ空間の紹介。 Java End Topology Programming

はじめに



私は、離散数学の観点だけでなく、機能分析の観点からも興味深い数学的なオブジェクトを選択することについて長い間考え、それをプログラムしようとしました。



このオブジェクトは、いわゆるトポロジ空間になりました 。 当然、コンピューターメモリ内のオブジェクトの表現の有限量は、数学で利用可能なトポロジ空間の絶対モデリングを許可しません。つまり、有限トポロジで満たされる必要があります。



幸いなことに、これは、四肢によって標準的な数学的概念を操作できるようにするだけでなく、一部のオブジェクトを簡素化するオブジェクトの1つです。 ポイント間の距離を測定する方法がないオブジェクトを研究することは、さらに興味深いことです。 はい、はい、あなたは正しいと聞きました。 一般的なトポロジでは、このような機会はありません。



しかし、まず最初に。



定義



まず、位相空間の古典的な定義を示します。



Xを任意のセットとします。 以下の条件が満たされる場合、そのサブセットのシステムτはトポロジと呼ばれます。

  1. 空のセットとセットXはトポロジに属します
  2. トポロジに属する任意の数のセットの和集合は、トポロジに属します。
  3. トポロジに属する有限数のセットの共通部分は、トポロジに属します。




この場合の任意の数のセットは、可算または不可算の数のセットの和集合を取ることもできることを意味します。 当然、これは無限集合の場合にのみ意味があります。



私が言ったように、コンピューターではすべてが有限です。 Xが有限集合であると仮定した場合、トポロジの定義はどのように変わりますか。



定義は次のようになります。

Xを有限のカーディナリティーの任意のセットとします。 以下の条件が満たされている場合、そのサブセットのシステムτは有限トポロジと呼ばれます。

  1. 空のセットとセットXはトポロジに属します
  2. 2つのセットがトポロジーに属する場合、それらの和集合はトポロジーに属します
  3. 2つのセットがトポロジに属する場合、それらの交差点はトポロジに属します




便宜上、「最終」という語は以降省略されます。 トポロジはセットのセットであることに注意してください。 残念ながら、主にSetインターフェースの共用体と交差の操作がsetオブジェクトを変更するため、Java言語で提示されるセットの標準クラスは私に適合しませんでしたが、必要です。 そのため、要素が追加されたときにのみオブジェクトが変更されます。



そこで、リンクリストに基づいてセットを表す次のクラスを作成しました。

クラスFSet <T>
package generaltopology; public class FSet<T> { protected class Node { T elem; Node next; public Node(T a) { elem = a; next = null; } } Node first; public FSet() { first = null; } public boolean contains(T a) { boolean flag= false; Node x = first; while (x != null && !flag) { if (x.elem.equals(a)) flag = true; x = x.next; } return flag; } public boolean subset(FSet<T> b) { boolean flag = true; Node x = first; while (x != null && flag) { if (!b.contains(x.elem)) flag = false; x = x.next; } return flag; } public void add(T a) { Node x = new Node(a); if (!contains(a)) { x.next = first; first = x; } } public FSet<T> union(FSet<T> b) { FSet<T> c = new FSet<>(); for (Node a = first; a != null; a = a.next) c.add(a.elem); for (Node a = b.first; a != null; a = a.next) c.add(a.elem); return c; } public FSet<T> intersection(FSet<T> b) { FSet<T> c = new FSet<>(); for (Node a = first; a != null; a = a.next) if (b.contains(a.elem)) c.add(a.elem); return c; } public FSet<T> complement(FSet<T> b) { FSet<T> c = new FSet<>(); for (Node a = first; a != null; a = a.next) if (!b.contains(a.elem)) c.add(a.elem); return c; } @Override public boolean equals(Object b) { FSet<T> bb = (FSet<T>)b; return subset(bb) && bb.subset(this); } @Override public String toString() { String s = "["; for (Node a = first; a != null; a = a.next) if (a.next != null) s += a.elem + ","; else s += a.elem; s += ']'; return s; } }
      
      







このクラスは、最終的なトポロジを構築するための主要なブリックです。 次に、トポロジ自体に進みましょう。 これまでのところ、私はそれについて話しただけですが、位相空間とは何であるかを述べていません。 これは、セットとそのトポロジのペア(X、τ)です。



したがって、クラスのデポジットは次のとおりです(セットを整数で構成する必要がありますが、ジェネリッククラスを使用することで、コードを任意の型に簡単に調整できます)。

 public class Topology extends FSet<FSet<Integer>> { static final FSet<Integer> EmptySet = new FSet<>(); FSet<Integer> X; }
      
      







ここでの問題は、トポロジコンストラクターの外観です。 トポロジは常にセットXのサブセットのシステムであることに注意してください。



読者の皆さん、最初の独立したタスクがここにあります。 次のステートメントを証明します。



Xを任意のセットとします。 次に、空の集合と集合Xで構成されるシステムτがトポロジを形成します。



簡単でしたね。 このトポロジは、些細と呼ばれます。 そのため、使用開始時に常に簡単なトポロジーを作成し、後でスーパークラスのaddメソッドを使用して必要なセットを追加しましょう。

 public Topology(FSet<Integer> X) { add(X); add(EmptySet); this.X = X; }
      
      







しかし、それだけではありません。 トポロジに要素を追加しました。 しかし、それは要素を追加するかしないかのトポロジーのままですか? 2番目と3番目のプロパティが満たされるかどうかをテストすることは難しくありませんが、問題はどこに書き込むかです。 要素が追加されたときに呼び出すことはできません。「Ay、これはトポロジではありません」というエラーが出力されるため、適切なトポロジを取得できないためです。 これは、作成の段階で、このエラーをしばらく「許す」必要があり、その後に適切なキックを与える必要があることを意味します。クラスにフラグと検証メソッドを追加します



 private boolean _isTopology; public boolean isTopology() { boolean flag = true; Node x = first; while (x != null && flag) { Node y = x.next; while (y != null && flag) { FSet<Integer> a = x.elem; FSet<Integer> b = y.elem; FSet<Integer> u = a.union(b); FSet<Integer> i = a.intersection(b); if (!contains(u)) flag = false; if (!contains(i)) flag = false; y = y.next; } x = x.next; } _isTopology = flag; return flag;
      
      







しかし、それはただのトレーニングでした。 ここで、さらにいくつかの定義を示します。



トポロジーτに含まれるセットはオープンと呼ばれます。

オープンを補完するセットはクローズドと呼ばれます。



ほとんどの学生はこれについて混乱しています。 これは次のタスクです。



X = {1,2,3,4}、τ= {∅、{1}、{2,4}、{1,2,4}、{1,2,3,4}}とする。 次のセットが開いているか閉じているかを判断しますか?

A = {1}

B = {1,3}

C = {1,2,3,4}

D = {2,3}





当然、これら2つのプロパティの検証は、次の方法で実行されます。

 public boolean isOpen(FSet<Integer> a) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!a.subset(X)) throw new IllegalArgumentException("      "); return contains(a); } public boolean isClosed(FSet<Integer> a) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!a.subset(X)) throw new IllegalArgumentException("      "); return contains(X.complement(a)); }
      
      







システムがトポロジを形成しない場合、または転送されたセットがトポロジ空間のXのサブセットではない場合、例外がスローされます。

過去のタスクを解決しようとせずにスキップした場合、2番目のメソッドが最初のメソッドから呼び出されない理由に驚くでしょう。 そして、あなたが決めるなら、あなたは理解するでしょう。



前のタスクへの回答
Aはオープンセットです。 トポロジに含まれています。

Bは閉じたセットです。 これは、トポロジに含まれるセット{2,4}を補完するものです。

Cは開いたセットと閉じたセットです。 トポロジの一部であるため、開いています。 ただし、トポロジに含まれる空のセットの補完であるため、閉じられています。

Dはトポロジにも含まれていないため Dはオープンセットもクローズセットでもありません。





次に、近隣の概念を導入する必要があります。



点xの近傍は、xを含む任意のオープンセットです。

セットMの近傍は、Mを含む任意のオープンセットGです。



問題3.前の問題からの位相空間を与えます。 セットXの点のすべての近傍と、セット{1,2}の近傍を検索します。



ポイントまたはセットのいくつかの近傍が存在する可能性があることに注意してください。 ここで、私はすでに私を満足させるクラスを見つけました:ArrayList。 したがって、見つかった近傍をリストするだけです。



 public ArrayList<FSet<Integer>> getNeighbourhoods(Integer x) { if (!_isTopology) throw new IllegalArgumentException("    "); ArrayList<FSet<Integer>> neighbourhoods = new ArrayList<>(); Node a = first; while (a != null) { FSet<Integer> open = a.elem; if (open.contains(x)) neighbourhoods.add(open); a = a.next; } return neighbourhoods; } public ArrayList<FSet<Integer>> getNeighbourhoods(FSet<Integer> M) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!M.subset(X)) throw new IllegalArgumentException("      "); ArrayList<FSet<Integer>> neighbourhoods = new ArrayList<>(); Node a = first; while (a != null) { FSet<Integer> open = a.elem; if (M.subset(open)) neighbourhoods.add(open); a = a.next; } return neighbourhoods; }
      
      







問題3への回答
  1. ポイント1の近傍:{1}、{1,2,4}、{1,2,3,4}
  2. ポイント2の近傍:{2,4}、{1,2,4}、{1,2,3,4}
  3. 近隣ポイント3:{1,2,3,4}
  4. 近隣ポイント4:{2,4}。 {1,2,4}、{1,2,3,4}
  5. セット{1,2}の近傍:{1,2,4}、{1,2,3,4}








距離、距離、基準などの馴染みのある用語が存在しないトポロジ空間では、そのような空間でジオメトリを構築するための基本的な基盤が近隣にあります。



したがって、さらにいくつかの定義。



集合Xからの点xは、xのすべての近傍にMからの少なくとも1つの点が含まれる場合、Xにある集合Mのタッチポイントと呼ばれます。

集合Xからの点xは、点xの各近傍にX以外のMからの少なくとも1つの点が含まれる場合、Xにある集合Mの限界点と呼ばれます。



したがって、いつものように、知識は新鮮ですが、決定後に簡単なタスクを提供します。その後、コード、そして解決策が続きます。



問題4.前のトポロジ空間で、セットM = {2,3}のタッチポイントとリミットポイントを見つけます

定義では、一連のトポロジのメンバーシップは必要ないことに注意してください。



対応するポイントのコード:

 boolean isAdherencePoint(Integer x, FSet<Integer> M) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!M.subset(X)) throw new IllegalArgumentException("      "); boolean flag = true; if (M.equals(EmptySet)) return false; ArrayList<FSet<Integer>> neighbourhoods = getNeighbourhoods(x); int i = 0; while (i < neighbourhoods.size() && flag) { FSet<Integer> a = neighbourhoods.get(i); FSet<Integer>.Node t = M.first; boolean containsM = false; while (t != null && !containsM) { if (a.contains(t.elem)) containsM = true; t = t.next; } if (!containsM) flag = false; i++; } return flag; } boolean isLimitPoint(Integer x, FSet<Integer> M) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!M.subset(X)) throw new IllegalArgumentException("      "); boolean flag = true; if (M.equals(EmptySet)) return false; ArrayList<FSet<Integer>> neighbourhoods = getNeighbourhoods(x); int i = 0; while (i < neighbourhoods.size() && flag) { FSet<Integer> a = neighbourhoods.get(i); FSet<Integer>.Node t = M.first; boolean containsM = false; while (t != null && !containsM) { if (!t.elem.equals(x) && a.contains(t.elem)) containsM = true; t = t.next; } if (!containsM) flag = false; i++; } return flag; }
      
      







答え
タッチポイント:2,3,4

制限ポイント:3





数学の重要な概念である集合の閉包を定義するためのすべてが揃った。



集合Mの閉包は、そのすべての接点の集合です。 通常、[M]と呼ばれます。



 FSet<Integer> getClosure(FSet<Integer> M) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!M.subset(X)) throw new IllegalArgumentException("      "); FSet<Integer> c = new FSet<>(); FSet<Integer>.Node a = X.first; while (a != null) { if (isAdherencePoint(a.elem,M)) c.add(a.elem); a = a.next; } return c; }
      
      







トポロジ空間で再び作業を続けると、[{2,3}] = {2,3,4}であることがわかり、同時に閉じたセットが得られます。



もう1つの重要な概念は、 孤立点の概念です



Mからの他の点を含まない近傍が存在する場合、点xは集合Mの孤立点と呼ばれます。



問題5. x = 2が集合M = {2,3}の孤立点であることを証明する



 boolean isIsolated(Integer x, FSet<Integer> M) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!M.subset(X)) throw new IllegalArgumentException("      "); boolean flag = false; ArrayList<FSet<Integer>> neighbourhoods = getNeighbourhoods(x); int i = 0; while (i < neighbourhoods.size() && !flag) { FSet<Integer> a = neighbourhoods.get(i); FSet<Integer>.Node t = M.first; boolean containsothers = false; while (t != null && !containsothers) { if (!t.elem.equals(x) && a.contains(t.elem)) containsothers = true; t = t.next; } if (!containsothers) flag =true; i++; } return flag; }
      
      







さらに、同じセットに異なるトポロジを導入して、異なるスペースを取得できることを理解する必要があります。 ただし、トポロジ間で半順序を確立できます。

m1が完全にm2に含まれている場合、m1のトポロジーはm2のトポロジーよりも弱く、それ以外の場合はより強いと言われています。



明らかに、最も弱いトポロジは、単純なトポロジです。

問題6.任意のセットXを与えて、その上で最も強力なトポロジーを導入します。 すべての開いているセットと閉じているセットを示します。



  @Override public int compareTo(Topology o) { int a; if (!_isTopology || !o._isTopology) throw new IllegalArgumentException("    "); if (subset(o)) a = -1; else if (equals(o)) a = 0; else if (o.subset(this)) a = 1; else throw new IllegalArgumentException("  "); return a; }
      
      







答え
セットXに導入できる最も強力なトポロジは、セットXのすべてのサブセットで構成される、いわゆる離散トポロジです。セットXのすべてのサブセットは、オープンとクローズの両方です。





そして、この記事で説明したい最後の概念は、トポロジーの痕跡です。



Xにある集合A上のmのトポロジーに続くのは、B∩Aの形式のすべての集合で構成されるm Aのトポロジーです。ここで、Bはトポロジーに属します。



問題7.セットAのトポロジmのトレースがセットAのトポロジを形成することを証明する



 Topology getTrace(FSet<Integer> A) { if (!_isTopology) throw new IllegalArgumentException("    "); if (!A.subset(X)) throw new IllegalArgumentException("      "); FSet<Integer> AX = A.intersection(X); Topology c = new Topology(AX); Node f = first; while (f != null) { c.add(f.elem.intersection(A)); f = f.next; } return c; }
      
      







おわりに



これで、トポロジー空間とそのサブクラスのプログラミングに関する私のシリーズの記事の最初の部分である、有限トポロジー-Javaを締めくくりました。 次の部分では、トポロジベースについて少し説明する予定ですが、有限トポロジの場合、この概念は非常に単純化されます。有限トポロジ空間にはデフォルトで可算ベースがあり、次に何が起こるかがわかります。 あるトポロジ空間から別のトポロジ空間への連続マッピングについて説明する可能性があります。 そのようなオブジェクトをプログラムしようとするのはいいことですよね?



ご清聴ありがとうございました!



All Articles