You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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