Зростаючі синуси#10145

Зростаючі синуси (Розбір)

Конструктивно побудуємо потрібну послідовність. Оскільки синус є періодичною функцією з періодом , будемо шукати її у вигляді sin(k(2π + ɛ)), де k = 0, 1, 2, ... . Знайдемо таке натуральне число , для якого існує ціле , що A = 2πk + ɛ для якомога меншого значення . Наприклад, якщо перебрати від до , то найменше досягається при A = 710. У цьому випадку 710 ≈ 2π \cdot 113 + 0.00006028.

Нехай A = 710. Розглянемо послідовність

sin(A), sin(2A), sin(3A), ..., sin(nA)

Значення елементів цієї послідовності дорівнюють

sin(2π \cdot 113 + ɛ), sin(2 \cdot 2π \cdot 113 + 2 \cdot ɛ), sin(3 \cdot 2π \cdot 113 + 3 \cdot ɛ), ..., sin(n \cdot 2π \cdot 113 + n \cdot ɛ)

або з урахуванням періодичності ці значення еквівалентні

sin(ɛ), sin(2 \cdot ɛ), sin(3 \cdot ɛ), …, sin(n \cdot ɛ)

Функція на проміжку x ∈ [0; π/2] є зростаючою. Для того щоб послідовність вищезазначених дійсних чисел була монотонно зростаючою, достатньо виконання нерівності: n \cdot ɛ ≤ \pi / 2. Підставивши n = 10000 і ɛ = 0.00006028 отримаємо: 10000 \cdot 0.00006028 \le \pi / 2 або 0.6028 \le 1.57, що вірно. Таким чином, цим методом можна знайти 10^4 потрібних цілих чисел.

Реалізація алгоритму

Читаємо вхідне значення .

scanf("%d", &n);

На відрізку знаходимо таке натуральне число , для якого при представленні у вигляді A = 2πk + ɛ значення буде найменшим.

bestA = 0;
bestE = 2 * PI;
for (a = 1; a < 1000; a++)
{
  e = fmod(a, 2.0 * PI);
  if (e < bestE)
  {
    bestE = e;
    bestA = a;
  }
}

Значення x = bestA буде дорівнювати .

x = bestA;

Виводимо шукану послідовність: 0 \cdot 710, 1 \cdot 710, 2 \cdot 710, ..., (n - 1) \cdot 710.

for (i = 0; i < n; i++)
  printf("%d ", x * i);
printf("\n");