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