diff --git a/Makefile b/Makefile
index 407e812..08a856f 100644
--- a/Makefile
+++ b/Makefile
@@ -41,11 +41,14 @@ run-lab5-favorite-lang:
run-lab5-favorite-lang-fp:
dotnet run --project "lab 5/FavoriteLangFP/FavoriteLangFP.fsproj"
+run-lab5-mutually-prime:
+ dotnet run --project "lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj"
+
# Запуск Lab 5
run-all-lab5: run-lab5-hello-world run-lab5-quadratic-equation run-lab5-circle-cylinder \
run-lab5-number-operations run-lab5-recursion-types run-lab5-function-factory \
run-lab5-number-traversal run-lab5-lambda-traversal run-lab5-conditional-traversal \
- run-lab5-number-examples run-lab5-favorite-lang run-lab5-favorite-lang-fp
+ run-lab5-number-examples run-lab5-favorite-lang run-lab5-favorite-lang-fp run-lab5-mutually-prime
help:
@echo "Доступные команды:"
@@ -72,6 +75,7 @@ help:
@echo " make run-lab5-number-examples - Запустить практические примеры работы с числами"
@echo " make run-lab5-favorite-lang - Запустить программу о любимом языке программирования"
@echo " make run-lab5-favorite-lang-fp - Запустить программу о любимом языке с суперпозицией и каррированием"
+ @echo " make run-lab5-mutually-prime - Запустить программу обхода взаимно простых компонентов числа"
clean:
dotnet clean
@@ -87,13 +91,13 @@ lab5-docker-build:
docker compose build lab5-hello-world lab5-quadratic-equation lab5-circle-and-cylinder \
lab5-number-operations lab5-recursion-types lab5-function-factory \
lab5-number-traversal lab5-lambda-traversal lab5-conditional-traversal \
- lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp
+ lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp lab5-mutually-prime
lab5-docker-run:
docker compose up lab5-hello-world lab5-quadratic-equation lab5-circle-and-cylinder \
lab5-number-operations lab5-recursion-types lab5-function-factory \
lab5-number-traversal lab5-lambda-traversal lab5-conditional-traversal \
- lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp
+ lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp lab5-mutually-prime
# Docker lab 5 отдельные программы
lab5-hello-world-docker-run:
@@ -132,6 +136,9 @@ lab5-favorite-lang-docker-run:
lab5-favorite-lang-fp-docker-run:
docker compose up lab5-favorite-lang-fp
+lab5-mutually-prime-docker-run:
+ docker compose up lab5-mutually-prime
+
ci-local:
circleci config validate
circleci local execute
diff --git a/compose.yaml b/compose.yaml
index 1c6f39e..3f9d165 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -116,4 +116,13 @@ services:
volumes:
- ./lab 5/FavoriteLangFP:/app
stdin_open: true
+ tty: true
+
+ lab5-mutually-prime:
+ build:
+ context: ./lab 5/MutuallyPrimeTraversal
+ dockerfile: ../../Individual Task 1/Dockerfile
+ volumes:
+ - ./lab 5/MutuallyPrimeTraversal:/app
+ stdin_open: true
tty: true
\ No newline at end of file
diff --git a/lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj b/lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj
new file mode 100644
index 0000000..7e0dd2a
--- /dev/null
+++ b/lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj
@@ -0,0 +1,13 @@
+
+
+
+ Exe
+ net7.0
+ MutuallyPrimeTraversal
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lab 5/MutuallyPrimeTraversal/Program.fs b/lab 5/MutuallyPrimeTraversal/Program.fs
new file mode 100644
index 0000000..6579976
--- /dev/null
+++ b/lab 5/MutuallyPrimeTraversal/Program.fs
@@ -0,0 +1,72 @@
+open System
+
+// НОД двух чисел
+let rec gcd a b =
+ if b = 0 then abs a
+ else gcd b (a % b)
+
+// взаимно простые? (НОД равен 1)
+let areCoprime a b =
+ gcd a b = 1
+
+// обход взаимно простых компонентов числа
+// Args:
+// - n: число, с которым ищем взаимно простые числа
+// - operation: функция
+// - initialValue: начальное значение для операции
+let traverseCoprime (n: int) (operation: int -> int -> int) (initialValue: int) =
+ // Проходим по всем числам от 1 до n
+ [1..n]
+ |> List.filter (fun i -> areCoprime n i)
+ |> List.fold operation initialValue
+
+// примеры операций для использования с traverseCoprime
+let sum a b = a + b
+let product a b = a * b
+let min a b = if a < b then a else b
+let max a b = if a > b then a else b
+let count _ b = b + 1
+
+[]
+let main argv =
+ Console.OutputEncoding <- Text.Encoding.UTF8
+
+ printfn "Задание 13. Обход взаимно простых компонентов числа."
+
+ printf "Введите число: "
+ let n =
+ match Int32.TryParse(Console.ReadLine()) with
+ | true, value when value > 0 -> value
+ | _ ->
+ printfn "Некорректный ввод. Используется значение по умолчанию 12."
+ 12
+
+ let coprimes = [1..n] |> List.filter (fun i -> areCoprime n i)
+ printfn "Числа, взаимно простые с %d: %A" n coprimes
+
+ let sumResult = traverseCoprime n sum 0
+ printfn "Сумма взаимно простых чисел: %d" sumResult
+
+ let productResult = traverseCoprime n product 1
+ printfn "Произведение взаимно простых чисел: %d" productResult
+
+ let minResult = traverseCoprime n min Int32.MaxValue
+ printfn "Минимальное взаимно простое число: %d" minResult
+
+ let maxResult = traverseCoprime n max Int32.MinValue
+ printfn "Максимальное взаимно простое число: %d" maxResult
+
+ let countResult = traverseCoprime n count 0
+ printfn "Количество взаимно простых чисел: %d" countResult
+
+ printfn "\nПримеры пользовательских функций:"
+
+ let sumOfSquares a b = a + b * b
+ let sumSquaresResult = traverseCoprime n sumOfSquares 0
+ printfn "Сумма квадратов взаимно простых чисел: %d" sumSquaresResult
+
+ let productOfDifferences a b = a * (abs (n - b))
+ let prodDiffResult = traverseCoprime n productOfDifferences 1
+ printfn "Произведение модулей разности (n - число): %d" prodDiffResult
+
+ 0
\ No newline at end of file