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