Знайомство з математикою для будь-якої людини починається у дитинстві з лічби. Це навіть стає певною грою для дитини та батьків: я вмію рахувати до 10, потім 20, сотня - нова мета. Потім звісно виникає цікавість - а яке число найбільше ти знаєш? Ну із звісно, наступний етап уже на іншому рівні: а як скласти два великих числа? Потім це питання ставиться уже коли доводиться вивчати програмування - як скласти числа які неможливо вмістити у доступній розрядності.
Як народжуються великі числа
Цікаво, що саме поняття "велике число" - річ відносна. Для дитини, яка щойно навчилась рахувати до ста, тисяча вже здається чимось космічним. Для школяра старших класів мільйон - звичайна справа, а от мільярд і трильйон уже потребують пояснення. Для науковця ж навіть трильйон - дрібниця, бо в астрофізиці чи квантовій фізиці оперують числами, які записати без скорочень просто неможливо на аркуші паперу.
Математики завжди шукали спосіб зручно записувати та називати великі кількості. Спочатку з'явилися назви для десятків, сотень, тисяч. Потім людству знадобилися слова для мільйонів і мільярдів - торгівля, населення країн, державні бюджети вимагали таких понять.
Іменовані числа: мільйон, мільярд і далі
У шкільній програмі зазвичай вивчають такий ряд великих чисел:
- тисяча - 103;
- мільйон - 106;
- мільярд - 109;
- трильйон - 1012;
- квадрильйон - 1015;
- квінтильйон - 1018.
Далі йдуть секстильйони, септильйони, октильйони - назви існують аж до чисел з десятками і сотнями нулів, хоча в побуті вони практично не застосовуються. Варто пам'ятати, що в різних мовних традиціях (короткій та довгій шкалах) назви можуть позначати різні порядки величини, і це часто плутає навіть дорослих.
Наукова нотація як порятунок від нулів
Уявіть, що потрібно записати число з сотнею нулів. Робити це вручну - марудно й непрактично. Тому в математиці та фізиці користуються науковою нотацією, коли число подається як добуток мантиси на степінь десятки:
\[ N = a \times 10^{n} \]
де \(a\) - число від 1 до 10, а \(n\) - показник степеня, який власне і показує "розмір" числа. Наприклад, маса Землі приблизно дорівнює \(5{,}97 \times 10^{24}\) кілограмів. Записати це число повністю - означало б намалювати двадцять з гаком нулів, що жодним чином не додає зрозумілості.
Математик Едвард Казнер якось попросив свого小 небожа придумати назву для числа з сотнею нулів. Хлопчик запропонував слово "гугол". Так у математику увійшов термін, який згодом дав ім'я відомій компанії - щоправда, з іншим написанням.
Коли числа стають справді гігантськими - гугол і гуголплекс
Гугол дорівнює \(10^{100}\) - одиниці зі ста нулями. Число вражає уяву, але воно й близько не найбільше з тих, що зустрічаються в математиці. Існує ще гуголплекс - це \(10^{\text{гугол}}\), тобто одиниця, за якою слідує стільки нулів, скільки складає сам гугол. Якщо спробувати записати гуголплекс на папері, стандартним шрифтом, то такого паперу не вистачило б у всьому видимому Всесвіті.
Цікавий факт про межі Всесвіту та великі числа
Кількість атомів у видимому Всесвіті оцінюють приблизно у \(10^{80}\). Це число менше за гугол, а отже, навіть гугол - величина, яка перевищує все, що фізично існує навколо нас у формі окремих часток матерії.
У математиці існують і значно більші конструкції - число Грема, наприклад, настільки величезне, що його неможливо записати навіть у степеневій формі, і для опису використовують спеціальну нотацію стрілок Кнута. Але це вже тема для окремої, більш просунутої розмови.
Великі числа у програмуванні
Коли захоплення математикою переходить у програмування, з'ясовується неприємна річ: комп'ютер не може зберігати число нескінченного розміру. Кожен тип даних має фіксовану розрядність, тобто певну кількість бітів пам'яті, виділену під зберігання значення.
Ось приблизні межі для поширених цілочисельних типів:
- 8-бітний тип (byte) вміщує значення від -128 до 127.
- 16-бітний тип (short) - приблизно до 32 тисяч.
- 32-бітний тип (int) - до 2 147 483 647.
- 64-бітний тип (long) - до понад 9 квінтильйонів.
Якщо потрібно скласти два числа, кожне з яких перевищує ці межі, звичайна арифметика процесора просто "переповниться" - результат стане некоректним, і саме тут студенти зазвичай уперше стикаються з поняттям переповнення (overflow).
Як програми рахують числа, що не вміщуються в пам'яті
Для розв'язання цієї проблеми існує так звана довга арифметика (arbitrary-precision arithmetic). Суть проста: число розбивається на масив менших частин - наприклад, кожна частина відповідає одному розряду або групі розрядів, - а операції додавання, множення чи ділення виконуються так само, як ми робимо це вручну на аркуші, з переносами між розрядами. Так влаштований і калькулятор великих чисел, який виконує обчислення онлайн.
У багатьох сучасних мовах програмування така арифметика вже вбудована. Python, наприклад, дозволяє оперувати числами довільної довжини без додаткових бібліотек. У Java для цього існує клас BigInteger, а у мовах на кшталт C чи C++ доводиться підключати спеціальні бібліотеки або писати власну реалізацію.
a = 123456789012345678901234567890 b = 987654321098765432109876543210 print(a + b)
Такий код у Python спрацює без жодних помилок, хоча числа тут значно перевищують межі звичайного 64-бітного цілого. Саме розуміння того, як влаштована довга арифметика, часто стає першим серйозним кроком студента від "просто писати код" до розуміння того, що відбувається під капотом мови програмування.
Шлях від дитячого "я вмію рахувати до ста" до довгої арифметики у Python насправді дуже логічний і послідовний. Кожен новий рівень - це не заперечення попереднього, а розширення меж того, що ми вважали "великим". А яке найбільше число доводилося зустрічати вам - у школі, у грі чи в коді? Поділіться в коментарях, чи траплялося стикатися з переповненням розрядності на практиці - таке питання варте окремого обговорення.
Схожі публікації