Длинка вBig integers in Pascal
Difference between ru1 and en1, changed 2,096 character(s)
ПриветHello, Codeforces!↵

Когда говорят про языки программирования со встроенной реализацией длинной арифметики, обычно говорят о таких языках, какWhen we talk the languages with built-in big integer implementation, usually such languages as _Java_ илиor _Python_. Сегодня я расскажу про длинку в языке _Pascal_, а, точнее, в его реализации are mentioned. Now I'll tell you about long arithmetic implementation in _Pascal_ (more precisely, in the _Free Pascal Compiler_).↵

Простейший код, который читает два "длинных" числа и складывает их, выглядит такThe simplest code, which reads two big integers and outputs their sum, looks like this:↵

<spoiler summary="
КодCode">↵

~~~~~↵
program sum;↵

{$Mode Delphi}↵

uses↵
  gmp;↵

var↵
  sa, sb: string;↵
  a, b: MPInteger;↵
begin↵
  readLn(sa);↵
  readLn(sb);↵
  a := sa; b := sb;↵
  writeLn(string(a + b));↵
end.↵
~~~~~↵

</spoiler>↵

Модуль `gmp` содержит все классы и операторы дя работы с "длинными" числами.↵

Как он работает? Этот модуль содержит заголовки функций, импортируемые из [_GNU Multiprecision Library_](https://gmplib.org/). Программа и библиотека связываются динамически, поэтому для работы программы необходимо, чтобы эта библиотека была установлена. К счастью, в большинстве дистрибутивов Linux она установлена по умолчанию и поэтому может быть использована в таких системах, как _ejudge_ и _Яндекс.Контест_. В тестирующих системах на _Windows_ библиотека не установлена, поэтому такая штука не сработает.↵

Для удобства работы в модуле реализована объектно-ориентированная обёртка над функциями `libgmp`, для которой перегружены все необходиые операторы (да-да, во _Free Pascal_ есть перегрузка операторов!)↵

Что еще примечательно, в `libgmp` реализовано быстрое извлечение целочисленного квадратного корня. Поэтому можно написать очень простой, быстрый и короткий код на задачу F с [заочного тура Открытки](https://olympiads.ru/zaoch
`gmp` unit contains all the classes and operators to work with big integers.↵

How does it work? This unit contains bindings for [_GNU Multiprecision Library_](https://gmplib.org/). The program and the library are linked dynamically, so, to make the program work this library is required to install. Luckily, many Linux distros install `libgmp` by default and so this trick can be used in the testing systems like _ejudge_ or _Yandex.Contest_. Testing systems on _Windows_ don't have this library, so this thing won't work.↵

For convenience the unit implements an object-oriented wrapper for `libgmp` functions, for which all the operators are overloaded (yes, _Free Pascal_ supports operator overloading!)↵

What is also remarkable, `libgmp` has implementation for calculating fast integer square root. So here is a short implementation for problem F for [elimination to Moscow Open Olympiad](https://olympiads.ru/zaoch) (the website by the link is in Russian and , unfortunately, I cannot find the English version of the statements
).↵

<spoiler summary="
КодCode">↵

~~~~~↵
program F;↵

{$mode objfpc}{$h+}↵
{$optimization LEVEL3}↵

uses gmp;↵

var↵
  num: string;↵
  mpNum: MPInteger;↵
  root, rem: MPInteger;↵
begin↵
  readLn(num);↵
  mpNum := num;↵
  mpNum := mpNum - 1;↵
  z_sqrtrem(root, rem, mpNum);↵
  if rem < root then begin↵
    writeln(string(rem + 1));↵
  end else begin↵
    writeln(string(2 * root + 1 - rem));↵
  end;↵
end.↵
~~~~~↵

</spoiler>↵

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en1 English gepardo 2018-01-12 13:43:58 2096 Initial revision for English translation
ru1 Russian gepardo 2018-01-12 13:21:33 2064 Первая редакция (опубликовано)