Как стать автором
Обновить
6
0

Пользователь

Отправить сообщение

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

Время на прочтение8 мин
Количество просмотров13K

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





Введение


В прошлый раз мы познакомились с основным понятиями теории топологических пространств, а также рассмотрели класс для представления конечных топологических пространств, написанный на языке Java. Сегодня мы двинемся дальше, изучим понятие базы топологии и получим представление о том, дла чего она нужна, а также определим понятие непрерывного отображения топологических пространств. Основной интерес последнее вызывает тем, что в топологическом пространстве отсутствует понятие расстояния между объектами, но тем не менее мы можем описать формальным языком достаточную близкость объектов в терминах… Ну, впрочем, вы это узнаете чуть позже.
Читать дальше →
Всего голосов 14: ↑12 и ↓2+10
Комментарии2

Введение в топологические пространства. Программирование конечных топологий на Java

Время на прочтение10 мин
Количество просмотров31K

Введение


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

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

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

Но обо всём по порядку.
Читать дальше →
Всего голосов 26: ↑25 и ↓1+24
Комментарии20

Создание барьера синхронизации с использованием C++11

Время на прочтение5 мин
Количество просмотров26K
Введение

Сравнивая две различные технологии параллельного программирования: потоки POSIX и потоки C++11, можно заметить, что в последних отсутствует аналог типа barrier_t из библиотеки pthread.

Довольно странно, что такой важный примитив синхронизации отсутствует в стандартной библиотеке. В этой статье пойдёт речь о том, как сделать барьер с использованием только библиотек, входящих в набор стандарта C++11.

Определение
Барьер — один из примитивов синхронизации. Он создаётся на некоторое количество потоков. Когда первый поток завершает свою работу, то он остаётся ждать у барьера и ждёт, пока не завершат работу остальные потоки.
Как только у барьера накапливается ровно столько потоков, на сколько был создан барьер, все потоки, которые ожидают у барьера, продолжают свою работу.

Начнём создавать свой барьер, с блэкджеком и ...
Читать дальше →
Всего голосов 12: ↑11 и ↓1+10
Комментарии31

Реализация стека, очереди и дека на языке F# в функциональном стиле

Время на прочтение5 мин
Количество просмотров5.3K
Недавно я познакомился с концепцией функционального программирования. Возможно, в этой статье я изобретаю велосипед, однако я считаю, что эти действия являются весьма полезными для обучения, а также для более чёткого понимания функционального программирования.

Давайте попробуем реализовать основные типы данных: стек, очередь и дек — на языке F#, по возможности используя чистые функции. Естественно, они будут основаны на списках.

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

Детерминированность функции означает то, что она выдаёт одинаковый результат для одинакового набора аргументов.
Побочными эффектами функций являются изменение глобальных переменных, обработка исключений, операции ввода-вывода, и т. д.

Стек


Прежде всего начнём со стека. В F# основным типом данных для хранения нескольких однотипных элементов является не массив, а список. Если перед нами стоит задача превратить список в стек, то какие функции нам понадобятся?

Во-первых, нам необходима функция для добавления элемента в вершину стека. Эта функция традиционно называется push. Однако эта функция нас особо не интересует, поскольку она очень просто реализуется:

let push stk el = el :: stk


Довольно простая функция, которая имеет тип 'a list -> 'a -> 'a list, однако не все дальнейшие функции позволят обращаться с собой таким простым способом.

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

Читать дальше →
Всего голосов 14: ↑11 и ↓3+8
Комментарии11

В погоне за стульями

Время на прочтение2 мин
Количество просмотров6.1K
В соседнем посте была приведена интересная задача, условие которой звучит следующим образом:

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

На ближайшее время позволим себе абстрагироваться от точных численных значений и положим вероятность того, что бриллианты зашиты, равной p, а количество стульев — n.

Хотите узнать правильное решение этой задачи? Добро пожаловать под кат!

Читать дальше →
Всего голосов 12: ↑4 и ↓8-4
Комментарии21

Моделирование пуассоновского процесса

Время на прочтение8 мин
Количество просмотров33K

Введение


Одним из важнейших процессов, наблюдаемых в природе, является пуассоновский точечный процесс. Поэтому важно понять, как такие процессы можно моделировать. Методы моделирования различаются в зависимости от типа пуассоновского точечного процесса, т. е. пространства, в котором протекает процесс и однородности или неоднородности процесса. Мы не будем заинтересованы развитием пуассоновского точечного потока или с важными приложениями его в различных областях. Чтобы этот материал показался интересным, читателю настоятельно рекомендуется прочитать соответствующие разделы в Феллере (1965) и Синларе (1975) для основной теории и некоторые разделы в Триведи (1982) для приложений в ИТ.

На первом шаге мы определим пуассоновский процесс на [0;+∞). Процесс полностью определяется семейством случайных событий, которые происходят в определённые случайные моменты времени 0 < T1 < T2 <… Эти события могут относиться ко множеству вещей, таких как ограбление банков, рождению пяти близнецов, и аварии с участием такси Монреаля. Если N(t1,t2) — это количество событий, происшедших за временной интервал (t1,t2), то часто выполнены два следующих условия:
Читать дальше →
Всего голосов 17: ↑10 и ↓7+3
Комментарии1

Моделирование простейшего потока

Время на прочтение2 мин
Количество просмотров16K
Всего с помощью двух слов можно охарактеризовать такие вещи, как

  • поток вызовов на телефонной станции
  • поток автомобилей на магистрали
  • поток абонентов, звонящих в техподдержку


и многое другое. Всё это называется «простейший поток».

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

Особенно актуальным является последний пункт приведённого списка, поскольку юзеры, не знающие простых основ компьютера, успевают их нереально задолбать, а зная параметры потока, можно спрогнозировать их количество.
Смоделировать количество юзеров
Всего голосов 22: ↑9 и ↓13-4
Комментарии6

Реализация алгоритма Евклида на Shakespeare

Время на прочтение4 мин
Количество просмотров6.5K
Как известно, сейчас существует довольно много эзотерических языков программирования, среди которых имеется небезызвестный Brainfuck.
В этой статье речь пойдёт о языке Shakespeare, который разработали Джон Аслауд и Карл Хассельстром. Целью создания этого языка является маскировка кода программы под пьесы Уильяма Шекспира. Поскольку программа Hello, world! уже разобрана в документации и имеет довольно объёмный вид, то мы попытаемся написать на нём довольно простой алгоритм Евклида для нахождения наибольшего общего делителя двух целых чисел.

Общая часть


Все слова данного языка делятся на три типа: ключевые слова, которые отвечают за выполнение каких-либо действий, переменные и комментарии.
При этом, всё, что не относится к первым двум группам, в этом языке программирования считается комментарием.

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

Заглавие программы, которое выполняет роль подобно ключевому слову program в Паскале, и не несёт никакой смысловой нагрузки. Далее идёт перечень лиц, которые участвуют в программе. Всё, что мы здесь объявим, и будет далее нашими переменными. Единственным ограничением на имя переменной является то, что это обязательно должно быть имя персонажа из пьесы Шекспира.
Как и любая пьеса, эта программа делится на акты и сцены, которые занумерованы римскими цифрами. Акты и сцены играют роль меток для переходов, как условных, так и безусловных.

В этом языке роль кирпича играют существительные и прилагательные. При этом существительное имеет значение 1 или -1 в зависимости от того, имеет ли это существительное положительный или отрицательный смысл. В трансляторе этого языка содержатся словари, чтобы правильно определять смысл существительного. Каждое прилагательное, добавленное спереди к существительному, увеличивает его в 2 раза. С помощью этих знаний мы уже можем получить числа, которые являются степенью двойки, и противоположные им.
Для того, чтобы получить другие числа, используютя ключевые слова sum и difference. Кроме того, чтобы узнать значение переменной, которую мы хотим получить, мы можем использовать ключевое слово thyself. Например, число 6 можно получить, например, следующим способом:

You are brave charming hero. You are as good as the sum of cute pony and thyself
В этом способе число 6 представляется как 4 + 2. Слова hero и pony принимают значения 1, поскольку им придаётся положителньый смысл. Соответственно, brave charming hero представляется как 1 * 2 * 2 = 4. Второе предложение разбивается на сумму числа 2, чему соответствует cute pony, и значения переменной, на которое указывает ключевое слово thyself.
В переводе на любой язык программирования указанный фрагмент кода будет выглядеть примерно так:
X = 4;
X = 2 + X;


Для ввода и вывода в этом языке используются следующие фразы:

Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии5

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность