Введение в топологические пространства. Программирование конечных топологий на Java. Часть 2: База топологии. Непрерывные отображения

в 6:02, , рубрики: java, java 8, математика, Программирование, топология

Список частей:

Введение

В прошлый раз мы познакомились с основным понятиями теории топологических пространств, а также рассмотрели класс для представления конечных топологических пространств, написанный на языке Java. Сегодня мы двинемся дальше, изучим понятие базы топологии и получим представление о том, дла чего она нужна, а также определим понятие непрерывного отображения топологических пространств. Основной интерес последнее вызывает тем, что в топологическом пространстве отсутствует понятие расстояния между объектами, но тем не менее мы можем описать формальным языком достаточную близкость объектов в терминах… Ну, впрочем, вы это узнаете чуть позже.

База топологии

Прежде, чем мы пойдём дальше, я бы хотел задать вам следующий простой вопрос.

Упражнение 0. Пусть X — множество из n элементов. Сколько элементов содержит дискретная топология т, содержащая все подмножества множества X?

Очевидно, что ответом будет являться 2n.
Если бы мы воспользовались классом, описанным в предыдущей статье, для создания дискретной топологии на множестве из 10 элементов, то нам понадобилось бы добавить в топологию 1024 множества: довольно много рутинной работы, вы не находите?

Но с помощью базы вам достаточно задать всего лишь 10 множеств вместо 1024. А если у вас топология не дискретная, то и того меньше.

Итак, перейдём к определению. Существует несколько эквивалентных определений базы топологии. Я приведу как основное то определение, которое используется в колмогоровской школе, а затем докажу эквивалентность другого определения.

Определение 1. Совокупность J открытых подмножеств множества X называется базой топологии, если всякое открытое подмножество G пространства (X, т) может быть представлено как объединение некоторого набора множеств из J.

С математической точки зрения это определение вполне понятно, однако запрограммировать его является достаточно нетривиальной задачей. Ситуацию усложняет и то, что множество G не обязано быть объединением двух множеств базы, оно может быть объединениём и трёх, и четырёх, и так далее.

К счастью, дело поможет упростить следующая теорема.
Теорема 1. Для того, чтобы система J была базой топологии, необходимо и достаточно, чтобы для каждого открытого множества G и для каждой точки x из G существовало такое множество G(x), принадлежащее J и содержащее x, что G(x) является подмножеством G.

Доказательство теоремы также достаточно простое. Сперва докажем достаточность условия. Это означает, что если выполнено написанное условие, то J будет базой топологии.
Но если оно выполнено, то G можно представить как объединение по всем x из G множеств G(x), т. е. выполнено условие из определения, и J — база топологии.
Необходимость условия означает то, что если J — база, то верно наше условие. Но если J — база, то любое открытое множество представимо в виде объединения множеств из J, откуда немедленно вытекает условие.

Эта теорема уже лучше помогает запрограммировать алгоритм определения, является ли базой данная система подмножеств, однако некоторую сложность здесь представляет то, что первым квантором условия является квантор всеобщности.

А это означает, что при проектировании алгоритма мы должны идти от обратного: сперва считаем, что наша система база, и меняем решение, если выполнено обратное утверждение.

В математике обращение таких условий происходит следующим образом: квантор всеобщности заменяется на квантор существования и наоборот, а предикат заменяется на обратный.

Поэтому алгоритм, записанный на естественном языке, будет звучать следующим образом:

1. Считаем, что аргумент метода является базой топологии.
2. Если существует такое открытое множество G и такая точка x из G, что любое множество G из аргумента метода, содержащее x, НЕ явлется подмножеством G, то вернуть ЛОЖЬ, иначе вернуть ИСТИНУ.

public boolean isBase(FSet<FSet<Integer>> mbbase)
	{
		boolean flag = true;
		Node t = first;
		while (t != null && flag)
		{
			FSet<Integer> open = t.elem;
			FSet<Integer>.Node openNode = open.first;
			boolean isSubsetOpen = true;
			while (openNode != null && isSubsetOpen)
			{
				Integer x = openNode.elem;
				Node baseNode = mbbase.first;
				boolean forall = true;
				while (baseNode != null && forall)
				{
					if (baseNode.elem.contains(x) && baseNode.elem.subset(open))
						forall = false;
					baseNode = baseNode.next;
				}
				if (forall)
				{
					flag = false;
					isSubsetOpen = false;
				}
				openNode = openNode.next;	
			}
			t = t.next;
		}
		return flag;
	}

Теперь создадим небольшой класс для базы

public class Base extends FSet<FSet<Integer>>{
 public Base()
 {
	 super();
 }
}

Это необходимо для того, чтобы иметь возможность написать конструктор топологии по базе.

Если бы мы написали просто FSet<FSet>, то получили бы от компилятора следующую ошибку: Erasure of method is the same as another method, поскольку у нас уже есть конструктор с параметрами FSet. Это особенность языка Java.

А дополнить систему до топологии достаточно легко, только допишем несколько приватных методов. Но прежде, простые задачки.

Задача 1. Пусть X — множество мощности n, а т — дискретная топология, заданная на этом множестве. Найти базу топологии.

private void uniteAll()
	{
		for (Node p = first; p != null; p = p.next)
		{
			for (Node q = first; q != null; q = q.next)
				add(p.elem.union(q.elem));
		}
	}
	
	private void intersectAll()
	{
		for (Node p = first; p != null; p = p.next)
		{
			for (Node q = first; q != null; q = q.next)
				add(p.elem.intersection(q.elem));
		}
	}
	
	public Topology(Base base)
	{
		for (Node p = base.first; p != null; p = p.next)
			add(p.elem);
		boolean isTpl = isTopology();
		while (!isTpl)
		{
			uniteAll();
			intersectAll();
			isTpl = isTopology();
		}
	}
Ответ к задаче

Базу топологии образуют все одноэлементные подмножества: {{1},{2},...,{n}}

Если говорить об общей топологии, то довольно важным классом топологических пространств являются пространства со счётной базой. Их также называют пространствами со второй аксиомой счётности.

Легко заметить, что конечные топологические пространства, а именно их мы и программируем, образуют подмножество всех пространств со второй аксиомой счётности.

Но если это вторая аксиома счётности, то должна быть и первая, не так ли? Ею мы сейчас и займёмся, а затем окунёмся в непрерывные отображения.

Определяющие системы окрестностей

Определение 2. Пусть для точки x топологического пространства X существует не более, чем счётная система окрестностей {On(x)} такая, что для всякого открытого множества G, содержащего x, найдётся окрестность On(x), содержащаяся в G. Эта система называется определяющей системой окрестностей точки x.

Определение 3. Если для каждой точки x существует её определяющая система окрестностей, то пространство удовлетворяет первой аксиоме счётности.

Это определение представляет больший интерес в рамках общей топологии, чем в рассматриваемых сейчас конечных топологиях, поскольку в качестве такой системы можно просто взять систему всех окрестностей данной точки. Однако, даже здесь можно поставить один интересный вопрос, который я любезно предоставлю Вам.

Задача 3. Привести пример конечного топологического пространства, в котором определяющая система окрестностей какой-либо точки лежит строго внутри системы всех окрестностей данной точки.

public boolean isFundamentalSystem(int x, ArrayList<FSet<Integer>> neighbourhoods)
	{
		boolean flag = true;
		Node t = first;
		while (t != null && flag)
		{
			FSet<Integer> open = t.elem;
			if (open.contains(x)) 
			{
				int i = 0;
				boolean isSubset = false;
				while (i < neighbourhoods.size() && !isSubset)
				{
					if (neighbourhoods.get(i).subset(open))
						isSubset = true;
					i++;
				}
				if (!isSubset)
					flag = false;
			}
			t = t.next;
		}
		return flag;
	}
Ответ к задаче

Пусть X = {1,2,3,4}, т = {Ø,{1},{3},{2,4},{1,3},{1,2,4},{2,3,4},{1,2,3,4}}.

Система {{3}} является определяющей системой окрестности точки 3.

Непрерывные отображения

Вот мы и подошли к самому интересному месту нашей сегодняшней лекции. К непрерывным отображениям.

В принципе, в Java уже есть интерфейс для отображений: Mapper, однако из-за того, что он содержит два метода, он не может быть использован в качестве функционального интерфейса.

Я использую Java 8, и мне бы хотелось писать отображения в более удобном виде, чем создавать класс, имплементирующий интерфейс и так далее. Если Ваша среда разработки не поддерживает Java 8, то код метода всё равно будет работать, а вот код вызова придётся поменять.

Итак, я создам следующий простенький интерфейс

@FunctionalInterface
public interface Mapping {
 Integer f(Integer x);
}

Аннотация выше необязательна, но она даст ошибку, если добавить в интерфейс ещё один абстрактный метод.

Теперь перейдём к математической стороне вопроса и дадим понятие непрерывности в терминах окрестностей точки.

Определение 4. Пусть (X, т1) и (Y, т2) — два топологических пространства. Отображение f пространства X в пространство Y называется непрерывным в точке x0, если для любой окрестности Uy0 точки y0 = f(x0) найдётся такая окрестность Vx0 точки x0, что f( Vx0) содержится внутри Uy0. Отображение f называется непрерывным, если оно непрерывно в каждой точке.

Если это перевести на русский язык, то определение непрерывности в точке звучать будет примерно так: Какую бы окрестность образа данной точки мы не взяли, найдётся окрестность данной точки, что образ этой окрестности будет лежать внутри окрестности образа точки.

Минуточку… Если вспомнить начала анализа, то мы получим в точности определение непрерывности функции по Коши, с той лишь разницей, что мы ушли от эпсилон-дельта языка и заменили отношение частичного порядка в определении близости.

Но не всё так просто здесь. Поэтому я предлагаю вам интересную задачку.
Задача 4. Пусть X — топологическое пространство с базой {{1},{2,4},{1,2,3,4}}, Y — с базой {{1},{3},{1,2,3,4}}.
Рассмотрим тождественное отображение f из X в Y, действующее по правилу f(x) = x. Является ли оно непрерывным? Если да, то докажите это. Если нет, покажите, в какой точке оно терпит разрыв.
Такой же вопрос и для отображения f из Y в X, действующего по правилу f(x) = x.

public boolean isContinuous(Mapping f, Integer x0, Topology Y)
	{
		boolean flag = true;
		int y0 = f.f(x0);
		ArrayList<FSet<Integer>> Uy0 = Y.getNeighbourhoods(y0);
		ArrayList<FSet<Integer>> Vx0 = getNeighbourhoods(x0);
		int i = 0; 
		while (i < Uy0.size() && flag)
		{
			int j = 0;
			boolean subset = false;
			while (j < Vx0.size() && !subset)
			{
				FSet<Integer> image = new FSet<>();
				for (FSet<Integer>.Node p = Vx0.get(j).first; p != null; p = p.next) {
					image.add(f.f(p.elem));
				}
				if (image.subset(Uy0.get(i)))
					subset = true;
				j++;
			}
			if (!subset)
				flag = false;
			i++;
		}
		return flag;
	}

На этот раз я приведу вам и код исполнения:

package generaltopology;
import java.util.*;

public class FSetDemo {

	public static void main(String[] args) {
		Base baseX = new Base();
		
		FSet<Integer> x = new FSet<>();
		x.add(1);
		x.add(2);
		x.add(3);
		x.add(4);
		
		FSet<Integer> a = new FSet<>();
		a.add(1);
		
		FSet<Integer> b = new FSet<>();
		b.add(2);
		b.add(4);
		
		FSet<Integer> c = new FSet<>();
		c.add(3);
		
		baseX.add(a);
		baseX.add(b);
		baseX.add(x);
		
		Base baseY = new Base();
		baseY.add(a);
		baseY.add(c);
		baseY.add(x);
		
		Topology tau = new Topology(baseX);
		System.out.println(tau);
		Topology tau2 = new Topology(baseY);
		System.out.println(tau2);
		
		for (int i = 1; i <= 4; i++)
		{
			System.out.print(tau.isContinuous(u -> u, i, tau2) + " ");
		}
		System.out.println();
		for (int i = 1; i <= 4; i++)
		{
			System.out.print(tau2.isContinuous(u -> u, i, tau) + " ");
		}
	}
}

Как вы видите, использование лямбда-выражения здесь довольно оправдано, поскольку позволяет достаточно точно задать правило отображения одного пространства в другое.

И, как я обещал, ответ:

Ответ

Ни то, ни другое отображение не являются непрерывными.
Отображение X в Y терпит разрыв в точке 3.
Отображение Y в X терпит разрыв в точках 2 и 4.

Заключение
Сегодня мы познакомились с важным понятием базы топологии и научились строить по ней всю топологию пространства. Мы узнали про аксиомы счётности и то, что конечные топологии удовлетворяют обеим аксиомам счётности.

В следующей части я планирую рассказать чуть побольше об отображениях топологических пространств, ввести понятие открытого и замкнутого отображения, а также дать признак непрерывности отображения, который будет проще, чем изложенный в определении и перейти к новой теме: аксиомам отделимости.

В конце этого цикла статей я также планирую дать какой-либо практический пример применения конечной топологии. Спасибо за внимание!

Автор: ProPupil

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js