(lab 5) feat: task-13: Добавлена новая программа MutuallyPrimeTraversal для обхода взаимно простых компонентов числа

main
Artem-Darius Weber 3 weeks ago
parent 430fa21a47
commit f3dc8ebe8c

@ -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

@ -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

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>MutuallyPrimeTraversal</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>
</Project>

@ -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
[<EntryPoint>]
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
Loading…
Cancel
Save