Skip to content

Это KMP библиотека добавляющая математические операции с матрицами, векторами, комбинаторикой и многим другим.

License

Notifications You must be signed in to change notification settings

plumsoftware/more-math

Repository files navigation

Kotlin Gradle Apache Maven Maven Central Version

More Math logo

More math

Мультиплатформенная библиотека Kotlin, добавляющая математические операции с матрицами, векторами, комбинаторикой и многим другим.

Telegram
Эмоджи для телеграм доступны по ссылке https://t.me/addemoji/RkIQSnNfAAA

Подключение

Чтобы подключить библиотеку нужно добавить строчки ниже в файл build.gradle.kts вашего мультиплатформенного модуля

dependencies {
    implementation("io.github.plumsoftware:more-math:<version>")
}

Документация на других языках (Documentation)

Содержание

Эта библиотека предоставляет функциональность для работы с вектором на плоскости, матрицей, комбинаторикой.

Возможности

Факториал

Вычисление факториала для числа до 21

val res = MoreMath.factorial(3)

Вычислить факторил для числа более 20

val res = MoreMath.bigFactorial(22L)

Тетрация

Вычислить тетрацию

val res = MoreMath.tetraction(2.0, 3)

Если, число в тетрации большое, то используйте

val res = MoreMath.bigTetraction(2.0, 40)

Другое

Чтобы вычислить наименьшее общее кратное двух чисел

val res = MoreMath.gcd(13, 17)

Вычисление стандартного отклонения ряда чисел

val res = MoreMath.standardDeviation(1.0, 2.0, 3.0)

Среднее значение

val res = MoreMath.average(1, 2, 3)

Узнать, положительное или отрицательное число

4.isPositive
(-4).isNegative

Матрица

Создать матрицу можно тремя способами

val matrix = matrixOf<Int> (
    mutableListOf(1, 2), 
    mutableListOf(3, 4)
)

или

val matrix = Matrix<Int> (
    mutableListOf(1, 2),
    mutableListOf(3, 4)
)

или

val matrix = Matrix<Int>(size = MatrixSize(row = 3, column = 4))

Последее создаст пустую матрицу. Также можно получить размер матрицы

val size = matrix.size

Операторы, доступные для матриц +, -, *, pow(), >, >= и подобные. Для сравнения контента матриц, используйте метод equals().

val matrix1 = matrixOf<Int> (
    mutableListOf(1, 2),
    mutableListOf(3, 4)
)
val matrix2 = matrixOf<Int> (
    mutableListOf(5, 6),
    mutableListOf(7, 8)
)
val matrix3 = matrix1.pow(2)

val plus = matrix1 + matrix2
val times = matrix1 * matrix2
val minus = matrix1 - matrix2

Вычислить определитель матрицы

val det = matrix.determinant()

Транспонировать матрицу

val transposedMatrix = matrix.transpose()

Умножить матрицу на число

val res = matrix.times(2)

Найти минимальный или максимальный элемент в матрице. Если Ваша матрица состоит из Double, Long, Float или Int, то воспользуйтесь кодом ниже

val min = matrix.minInMatrix()
val max = matrix.maxInMatrix()

или

val min = matrix.minInMatrixBy { it }
val max = matrix.maxInMatrixBy { it }

Граф

Создать взвешенный граф

val graph = Graph<VertexType, WeightType>(mode = GraphMode.UNDIRECTED)

Где VertexType - это тип вершины. WeightType - это тип веса вершины: Int, Double, Long, Float. mode - это тип графа: UNDIRECTED, DIRECTED.

Для создания связи нужно добавить вершины:

val graph = Graph<String, Int>()

val vertexA = Vertex(id = "A")
val vertexB = Vertex(id = "B")
val vertexC = Vertex(id = "C")
val vertexD = Vertex(id = "D")

graph.addVertex(vertexA)
graph.addVertex(vertexB)
graph.addVertex(vertexC)
graph.addVertex(vertexD)

Затем создайте связь между вершинами

graph.createConnection(from = vertexA, to = vertexB, weight = 2)

Получить минимальный путь в графе от и до вершины

val minPath: GraphPath<String, Double> = graph.minPath(from = Vertex("A"), to = Vertex("B"))

В результате будет возвращен GraphPath, который содержит пары - вершины и суммарный путь до следующей вершины.

Получить все вершины

val vertices = graph.vertices

Получить все связи

val vertices = graph.connections

Узнать, есть ли вершина

val vertex: Vertex<String>? = graph[someVertex]

Это вернёт null, если вершины в графе нет.

Заменить вершину в графе

val newVertex = Vertex("A")
val oldVertex = Vertex("B") //Эта вершина уже есть в графе
graph.set(oldVertex, newVertex, SetVertexMode.NEW_FROM_TO)

Это заменит все вершины во всех связях в графе и удалит старую вершину. Если вы хотите заменить только начальные вершины в связях или конечные, то используйте NEW_FROM или NEW_TO соответственно.

Для удаления всех связей используйте:

graph.removeConnectionsByVertex(someVertex, RemoveVertexMode.TO)

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

Для получения всех вершин без связей или наоборот всех вершин в связях

val freeList = graph.getFreeVertices()
val busyList = graph.getBusyVertices()

Комплексные числа

Создать комплексное число

val complex: Complex = complex(-4.0)

В результате будет 0.0 - 2.0i

Если Вам нужно указать реальную часть числа, то воспользуйтесь

val complex: Complex = complex(3, -4.0)

В результате будет 3.0 - 2.0i

Получить алгебраическую или геометрическую форму можно таким образом

val algebraic = complex.toAlgebraic()
val geometric = complex.toGeometric()

С комплексными числами можно выполнять +, -, *, /. Также доступны equals() и hashCode().

Вектор

Вектор на плоскости

Создание вектора аналогично созданию матрицы

val vector2 = vector2Of(1 , 2)

или

val vector2 = Vector2(1 , 2)

С векторами на плоскости доступны следующие операторы +, -, *, /. Также Вы можете использовать equals() и length().

val vector1 = vector2Of(1, 2)
val vector2 = vector2Of(3, 4)

val plus = vector1 + vector2
val minus = vector1 - vector2
val times = vector1 * vector2
val div = vector1 / vector2
val length = vector1.length()

Комбинаторика

Комбинации из 5 элементов по 2 элемента

val res = MoreMath.combinations(5, 2)

Размещения

val res = MoreMath.placements(5, 2)

Биноменальный коэффициент

val res = MoreMath.binomialCoefficient(5, 2)

About

Это KMP библиотека добавляющая математические операции с матрицами, векторами, комбинаторикой и многим другим.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published