<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>АНАЛІЗ ЕФЕКТИВНОСТІ РЕАЛІЗАЦІЇ АРИФМЕТИЧНИХ АЛГОРИТМІВ НА МОВАХ ПРОГРАМУВАННЯ C++ ТА PYTHON</article-title>
      </title-group>
      <pub-date>
        <year>2016</year>
      </pub-date>
      <fpage>26</fpage>
      <lpage>31</lpage>
      <abstract>
        <p>У даній роботі представлені результати обчислювального експерименту, метою якого є уточнення реальної швидкодії арифметичних алгоритмів з використанням арифметики довільної точності при реалізації на мовах програмування C++ та Python. Як математичну модель для арифметичних алгоритмів обрана цілочисельна «машина, що складає». «Машина, що складає» - це математична абстракція, введена Р. Флойдом та Д. Кнутом, суть якої полягає у тому, що лише за допомогою операцій додавання, віднімання, порівняння, присвоювання та обмеженої кількості регістрів можна з прийнятною обчислювальною ефективністю виразити більш складні операції, такі як знаходження лишку за модулем, множення, знаходження найбільшого спільного дільника, піднесення до степеня за модулем. Особливістю даної реалізації є використання арифметики довільної точності, що може бути корисним для використання у криптографічних алгоритмах. Ключові слова: C++, Python, GMP, додавання, віднімання, найбільший спільний дільник, піднесення до степеня, числа Фібоначчі. В данной работе представлены результаты вычислительного эксперимента, целью которого является уточнение реальной производительности арифметических алгоритмов с использованием арифметики произвольной точности при реализации на языках программирования C++ и Python. Как математическая модель для арифметических алгоритмов выбрана целочисленная «складывающая машина». «Складывающая машина» - это математическая абстракция, введённая Р. Флойдом и Д. Кнутом, суть которой заключается в том, что с помощью только операций сложения, вычитания, сравнения, присваивания и ограниченного количества регистров можно с приемлемой вычислительной эффективностью выразить более сложные операции, такие как нахождение остатка по модулю, умножение, нахождение наибольшего общего делителя, возведение в степень по модулю. Особенностью данной реализации является использование арифметики произвольной точности, что может быть полезным для использования в криптографических алгоритмах. Ключевые слова: C++, Python, GMP, сложение, вычитание, наибольший общий делитель, возведение в степень, числа Фибоначчи. This paper presents the results of the numerical experiment, which aims to clarify the actual performance of arithmetic algorithms implemented in C ++ and Python programming languages using arbitrary precision arithmetic. "Addition machine" has been chosen as a mathematical model for integer arithmetic algorithms. "Addition machine" is a mathematical abstraction, introduced by R. Floyd and D. Knuth. The essence of "addition machine" is the following: using only operations of addition, subtraction, comparison, assignment and a limited number of registers it is possible to calculate more complex operations such as finding the residue modulo, multiplication, finding the greatest common divisor, exponentiation modulo with reasonable computational efficiency. One of the features of this implementation is the use of arbitrary precision arithmetic, which may be useful in cryptographic algorithms.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>1) введення: read x;
«Машини, що складають» можуть працювати як з цілими числами, так і з дійсними. У даній роботі усі
операції вважаємо такими, що здійснюються над цілими числами, тому описаний пристрій називається
цілочисельною «машиною, що складає».</p>
      <p>Метою даної роботи є дослідження ефективності алгоритмів цілочисельної «машини, що складає» при її
реалізації за допомогою мов програмування С++ і Python, використовуючи арифметику довільної точності.
Використання арифметики довільної точності було вибране у зв'язку із можливим подальшим застосуванням
результатів даного дослідження у криптографії.
Методика дослідження
У даній роботі обмежимося розглядом і порівнянням таких операцій над цілими числами:
1) множення двох чисел;
2) піднесення до степеня за модулем;
3) знаходження лишку за модулем;
4) знаходження найбільшого спільного дільника (НСД).</p>
      <p>
        У роботі [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] були наведені наступні теоретичні оцінки складності операцій, які можуть бути реалізовані
за допомогою «машини, що складає» (таблиці). Також дані оцінки можна знайти у роботі [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>
        Основною ідеєю алгоритму знаходження лишку від цілочисельного ділення, який був запропонований
Р. Флойдом та Д. Кнутом у [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], є використання представлення Фібоначчі замість традиційного бінарного
представлення. Відомо, що будь-яке невід’ємне ціле число може бути представлене сумою чисел Фібоначчі.
Далі ключовими моментами є те, що, по-перше, за допомогою «машини, що складає» можна легко
переходити від пари чисел Фібоначчі &lt; Ft , Ft+1 &gt; до наступної пари &lt; Ft+1, Ft+2 &gt; використанням лише однієї операції
P2: read x; read y; read z; { вважається, що y ≥ 0, z &gt; 0 }
w ← w - w;
if y &gt;= z then
begin u ← x; v ← z;
repeat &lt;u, x&gt; ← &lt;x, u + x&gt;; &lt;v, z&gt; ← &lt;z, v + z&gt;;
until not y &gt;= z;
repeat if y &gt;= v then &lt;w, y&gt; ← &lt;w + u, y - v&gt;;
&lt;u, x&gt; ← &lt;x - u, u&gt;; &lt;v, z&gt; ← &lt;z - v, v&gt;;
until v &gt;= z;
end;
write w.
      </p>
      <p>P3: read x; read y; { вважається, що x &gt; 0, y ≥ 0 }
z ← y; z ← z + z;
while not y &gt;= z do
begin while x &gt;= z do &lt;y, z&gt; ← &lt;z, y + z&gt;
repeat if x &gt;= y then x ← x - y;
&lt;y, z&gt; ← &lt;z - y, y&gt;
until y &gt;= z;
&lt;x, y&gt; ← &lt;y, x&gt;; z ← y; z ← z + z;
end;
write x.</p>
      <p>
        Алгоритм обчислення найбільшого спільного дільника НСД(x,y) (P3) у командах регістрової машини
виглядає наступним чином [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]:
      </p>
      <p>
        І, нарешті, останній важливий алгоритм обчислення xy mod z (P5) за допомогою «машини, що складає»
виконується наступним чином, враховуючи допоміжний алгоритм P4 [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]:
P4: u ← 1; v ← 1; w ← y; { u = Fl, v = Fl+1, l = 1 }
repeat &lt;u, v&gt; ← &lt;v, u + v&gt; until not w &gt;= v; { u = Fl, v = Fl+1, y ≥ u }
r ← 1; s ← 1; t ← t - t; { u = Fl, v = Fl+1, l = λy }
repeat if w &gt;= u then
begin w ← w - u; t ← t + s;
end;
&lt;u, v&gt; ← &lt;v - u, u&gt;;
&lt;r, s&gt; ← &lt;s, r + s&gt; { l ← l -1 }
until u &gt;= v.
      </p>
      <p>P5: read x; read y; read z;
&lt;r, s, t&gt; ← &lt;Fλy, Fλy+1, yR&gt; { x = xl, w = xl+1, l = 1 }
x ← x mod z; w ← x; u ← 1;
repeat if t &gt;= r then
begin t ← t - r; u ← (uw) mod z;
end;
&lt;r, s&gt; ← &lt;s - r, r&gt;;
&lt;x, w&gt; ← &lt;w, (xw) mod z&gt;; { l = l + 1 }
until r &gt;= s;
write u.
Результати дослідження</p>
      <p>
        Для реалізації алгоритмів були використані мови програмування С++ з бібліотекою арифметики
довільної точності GMP [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] та Python з вбудованою підтримкою арифметики довільної точності. Деякі більш глибокі
результати порівняння ефективності мов програмування С++ та Python містяться у роботі [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>Характеристики персонального комп'ютера, на якому було проведене тестування реалізованих
алгоритмів, такі: процесор Intel Pentium Duo 2.8 ГГц, 4 Гб оперативної пам’яті, ОС Ubuntu 14.04 LTS x64. Версії
програмного забезпечення: GCC 4.8.4, GMP 5.1.3, Python 2.7.6.</p>
      <p>На рис. 1 показано результати порівняння швидкодії алгоритму P1 (x mod y) на персональному
комп’ютері при реалізації його за допомогою мов програмування С++ та Python.
Рис. 1. Порівняння часу виконання операції знаходження лишку від ділення при реалізації на мовах
програмування C++ та Python
На рис. 2 показано результати порівняння швидкодії алгоритму P2 (x[y/z]) на персональному комп’ютері
при реалізації його за допомогою мов програмування С++ та Python.</p>
      <p>Рис. 2. Порівняння часу виконання операції множення до степеня при реалізації</p>
      <p>на мовах програмування C++ та Python
На рис. 3 показано результати порівняння швидкодії алгоритму P3 (НСД(x, y)) на персональному
комп’ютері при реалізації його за допомогою мов програмування С++ та Python.</p>
      <p>Рис. 3. Порівняння часу виконання операції знаходження найбільшого спільного дільника
при реалізації на мовах програмування C++ та Python</p>
      <p>
        В результаті дослідження були отримані чисельні характеристики ефективності алгоритмів «машини,
що складає» та побудовані відповідні графіки, що дозволило на практиці підтвердити та уточнити теоретичні
оцінки складності даних алгоритмів, виведені Р. Флойдом та Д. Кнутом. Одним із практичних застосувань
розглянутих алгоритмів може бути їх ефективне використання на спеціально побудованому апаратному
забезпеченні, наприклад, для схеми RSA [
        <xref ref-type="bibr" rid="ref3 ref7">3, 7</xref>
        ], основою якої є операція піднесення до степеня за модулем
(x y mod z), а також застосування у криптографічних протоколах для випадків, коли набір доступних операцій
є обмеженим.
      </p>
      <p>Експериментальним шляхом були отримані такі основні результати:
• для C++/GMP середня швидкодія вбудованих складних операцій є у 47 разів більшою, ніж їх аналогів,
реалізованих за допомогою «машини, що складає»;</p>
      <p>• для Python середня швидкодія вбудованих складних операцій є у 228 разів більшою, ніж їх аналогів,
реалізованих за допомогою «машини, що складає»;</p>
      <p>• реалізація на C++/GMP арифметичних алгоритмів «машини, що складає» є у 3,8 разу швидшою за
аналогічну реалізацію на Python.</p>
      <p>
        Цікавим фактом є те, що швидкодія алгоритму НСД(x,y) на C++ є повністю однаковою як для
вбудованої операції mpz_gcd() з бібліотеки GMP [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], так і для його реалізації за допомогою «машини, що складає».
Для Python-реалізації алгоритму НСД(x,y) ситуація схожа: стандартна функція fractions.gcd() лише у 2 рази
швидша за реалізацію за допомогою «машині, що складає».
      </p>
      <p>Отже, результати експериментального порівняння надають можливість зробити висновок про те, що
реалізація арифметичних алгоритмів над цілими числами довільної точності на С++/GMP є в середньому у
3,8 раз швидшою за Python-реалізацію, але у той же час процес програмування на С++ є складнішим.</p>
      <p>Загалом, інтерпретатор Python показав досить високу швидкодію, що разом з вбудованою
арифметикою довільної точності, зручністю програмування та різноманіттям програмних модулів робить мову Python
одним з перспективних інструментів для дослідників в області інформатики та математики. У той же час, є
клас задач, які можуть бути ефективно вирішені тільки за допомогою мов C/C++ (відповідно, і за допомогою
мови Assembler), наприклад, написання драйверів пристроїв, програмування мікроконтролерів. Тому для
кожного класу задач необхідно правильно вибирати інструменти з урахуванням пріоритетів та уникати
суперечок з приводу «найкращої» або «ідеальної» мови програмування.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1. Tiobe.com. Tiobe Index | Tiobe - The Software Quality Company. [online] Available at: http://www.tiobe.com/tiobe_index
          <source>[Accessed 10 Feb</source>
          .
          <year>2016</year>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2. Pypl.github.io.
          <article-title>PYPL PopularitY of Programming Language index</article-title>
          . [online] Available at: https://pypl.github.
          <source>io/PYPL.html [Accessed 10 Feb</source>
          .
          <year>2016</year>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Floyd</surname>
            <given-names>R.</given-names>
          </string-name>
          and
          <string-name>
            <given-names>Knuth D. Addition</given-names>
            <surname>Machines. SIAM J. Comput</surname>
          </string-name>
          .
          <article-title>-</article-title>
          <year>1990</year>
          . -
          <volume>19</volume>
          (
          <issue>2</issue>
          ). - P.
          <fpage>329</fpage>
          -
          <lpage>340</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Anisimov</surname>
            <given-names>A.V.</given-names>
          </string-name>
          <string-name>
            <surname>Algorithmic</surname>
          </string-name>
          <article-title>Theory of Large Numbers</article-title>
          . Modular Arithmetic of Large Numbers [in Ukrainian], Akademperiodika, Kyiv. -
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. Gmplib.org.
          <source>The GNU MP Bignum Library</source>
          . [online] Available at: https://gmplib.org/ [Accessed 10 Feb.
          <year>2016</year>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Prechelt</surname>
            <given-names>L.</given-names>
          </string-name>
          <article-title>An empirical comparison of C, C++</article-title>
          , Java, Perl, Python, Rexx and Tcl // IEEE Computer.
          <article-title>-</article-title>
          <year>2000</year>
          . -
          <volume>33</volume>
          (
          <issue>10</issue>
          ). - P.
          <fpage>23</fpage>
          -
          <lpage>29</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Rivest</surname>
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shamir</surname>
            <given-names>A.</given-names>
          </string-name>
          and
          <string-name>
            <surname>Adleman L</surname>
          </string-name>
          .
          <article-title>A method for obtaining digital signatures and public-key cryptosystems</article-title>
          .
          <source>Communications of the ACM. - 1978</source>
          . -
          <volume>21</volume>
          (
          <issue>2</issue>
          ). - P.
          <fpage>120</fpage>
          -
          <lpage>126</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          http://orcid.org/0000-0001-8556-6158 Місце роботи автора:
          <article-title>Київський національний університет імені Тараса Шевченка, факультет кібернетики</article-title>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>