﻿using System;
using ExtendedNumerics; // Пространство имен настоящего BigRational

class Program
{
    static void Main()
    {
        Console.WriteLine(".NET 9 пример из Кулямина\n");
/*

Стандартизация и тестирование реализаций
математических функций, работающих с числами с
плавающей точкой
В. В. Кулямин
Институт системного программирования РАН (ИСП РАН),
109004, Б. Коммунистическая, 25, Москва, Россия
E-mail: kuliamin@ispras.ru
*/



        // === СЦЕНАРИЙ 1: Ваши точки (Идет к 6) ===
        BigRational x0_sc1 = 2;
        BigRational x1_sc1 = -4;

        Console.WriteLine("--- Сценарий 1 (Старт: 2 и -4) ---");
        RunMuller(x0_sc1, x1_sc1, 100);

// === СЦЕНАРИЙ 2: Истинные точки Кулямина (Должен уйти к 3) ===
        // Создаем чистые дроби 11/2 и 61/11 через конструктор
        BigRational x0_sc2 = new BigRational(11, 2);
        BigRational x1_sc2 = new BigRational(61, 11);



        Console.WriteLine("\n--- Сценарий 2 (Старт: 11/2 и 61/11) ---");
        RunMuller(x0_sc2, x1_sc2, 120);

        BigRational x0_sc3 = new BigRational(3, 1);
        BigRational x1_sc3 = new BigRational(3, 1);



        Console.WriteLine("\n--- Сценарий 3 от Жемини (Старт: 3/1 и 3/1) ---");
        RunMuller(x0_sc3, x1_sc3, 40);
    }

    static void RunMuller(BigRational x0, BigRational x1, int steps)
    {
        Console.WriteLine($" 0: {x0}");
        Console.WriteLine($" 1: {x1}");

        BigRational c111 = 111;
        BigRational c1130 = 1130;
        BigRational c3000 = 3000;

        for (int i = 2; i <= steps; i++)
        {
            // Формула Мюллера со скобками
            BigRational x2 = c111 - (c1130 - c3000 / x0) / x1;
            
            // Выводим шаг и его десятичное приближение для наглядности
            double approx = (double)x2; 
            Console.WriteLine($"{i,2}: >>>>{approx:F6}<<<<  ({x2})");

            x0 = x1;
            x1 = x2;
        }
    }
}