<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=305393&amp;view=findpost&amp;p=2612710</guid>
        <pubDate>Fri, 04 Jun 2010 16:30:10 +0000</pubDate>
        <title>[Delphi] Модуль Длинной Арифметики.</title>
        <link>https://forum.sources.ru/index.php?showtopic=305393&amp;view=findpost&amp;p=2612710</link>
        <description><![CDATA[Navi1982: Сдесь текущий статус моего модуля Длинной Арифметики. Конечно же мне помогали и подробную историю можно посмотреть <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2405957' target='_blank'>сдесь</a> или <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=285453&st=120&#entry2612178' target='_blank'>последнее сообщение</a>.<br>
Вот мои некоторые наработки:<br>
1. Числа хранятся в виде динамических массивов в таком вот виде:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;THugeInt = record //HugeInt &#60;=&#62; HI</div><div class="code_line">&nbsp;&nbsp; &nbsp;flag: longint; //number (data) length and his sign</div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword; //every elem is a digit in range 0..4294967295</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
2. Перед реализацией основных функций, я задумался об удобном способе проверять результат. Следовательно пришлось начать с функций преобразования текстовой строки компонента TEdit в заданный тип и обратно.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Форматирование числа в строке.</div><div class="code_line">Сначала проверяет знак - если отсувствует, добавляет &quot;+&quot; по умолчанию.</div><div class="code_line">Все остальные знаки считает цифрами, т.е принимает за &quot;0&quot;.</div><div class="code_line">Так-же удаляет все незначимые ноли в начале числа.}</div><div class="code_line">Function FormatStr(s:string):String;</div><div class="code_line">var</div><div class="code_line">&nbsp;num:String;</div><div class="code_line">&nbsp;i:Integer;</div><div class="code_line">&nbsp;rem0:boolean; //remove &quot;0&quot; while it&#39;s true</div><div class="code_line">begin</div><div class="code_line">&nbsp;case s[1] of</div><div class="code_line">&nbsp;&#39;-&#39;: begin num:=&#39;-&#39;; i:=2; end;</div><div class="code_line">&nbsp;&#39;+&#39;: begin num:=&#39;+&#39;; i:=2; end;</div><div class="code_line">&nbsp;else begin num:=&#39;+&#39;; i:=1; end;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;rem0:=true; //to remove not significant zeroes before number</div><div class="code_line">&nbsp;while i &#60;= length(s) do</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; case s[i] of</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;0&#39;: if rem0=false then num:=num+s[i];//to put or not to put? - that is question! :)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;1&#39;..&#39;9&#39;: begin rem0:=false; num:=num+s[i]; end;</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if rem0=false then num:=num+&#39;0&#39;;//put if significant!</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;&nbsp; i:=i+1;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;if length(num)=1 then num:=num+&#39;0&#39;;</div><div class="code_line">FormatStr:=num;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//Создана BugHunter&#39;ом по мотивам sCreator&#39;а</div><div class="code_line">{Функция преобразования форматированой строки-10сс в массив-2^32сс}</div><div class="code_line">{ Функция ожидает строку, содержащую корректную запись целого числа, &nbsp;}</div><div class="code_line">{ форматированую в соответствии со спецификацией: строка должна &nbsp; &nbsp; &nbsp; }</div><div class="code_line">{ содержать только цифры и возможно знак &#39;+&#39;, &#39;-&#39; или один лидирующий }</div><div class="code_line">{ пробел вместо знака &#39;+&#39;. Для входящей строки, не соответствующей &nbsp; &nbsp;}</div><div class="code_line">{ спецификации, результат работы функции непредсказуем. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">Function StrToHugeInt(const s: string): THugeInt;</div><div class="code_line">&nbsp;&nbsp;Var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, rdlen, j, toend, k: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;a: int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;alw: array[0..1] of longword absolute a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;aa, inmind: longword;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data:=nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1] in [&#39;+&#39;,&#39;-&#39;,&#39; &#39;]) then i:=2 else i:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;toend:=length(s)-i+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rdlen:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (toend&#62;0) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (toend&#62;=9) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;aa:=1000000000;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=9;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;aa:=10; for k:=2 to toend do aa:=aa*10;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=toend;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{умножаем result.data на aa}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inmind:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=0 to rdlen-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=int64(result.data[j])*aa+inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[j]:=alw[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inmind:=alw[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (inmind&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.data, rdlen+1); inc(rdlen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[rdlen-1]:=inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;aa:=strtoint(copy(s, i, k));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{складываем result.data и aa}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inmind:=aa;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=0 to rdlen-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=int64(result.data[j])+inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[j]:=alw[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inmind:=alw[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (inmind=0) then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (inmind&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.data, rdlen+1); inc(rdlen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[rdlen-1]:=inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(i, k); dec(toend, k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (toend=0) then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1]=&#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=-rdlen</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=rdlen;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//я тут добавил для обработки нолей.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (result.data=nil)and(result.flag=0) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetLength(result.data,1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; result.data[0]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; result.flag:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция преобразования числа HugeInt -&#62; HexStr}</div><div class="code_line">Function HugeIntToHexStr(Const op:THugeInt):String;</div><div class="code_line">Var i:integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:String;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;if op.flag&#60;0 then t:=&#39;-&#39; else t:=&#39;+&#39;;</div><div class="code_line">&nbsp;if (op.flag&#60;&#62;0)or(op.data&#60;&#62;nil) then</div><div class="code_line">&nbsp;for i:=abs(op.flag)-1 downto 0 do t:=t+IntToHex(op.data[i],8);</div><div class="code_line">result:=t;</div><div class="code_line">End;</div></ol></div></div></div></div><br>
<br>
3. Далее идут вспомогательные функции и процедуры для работы основных.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Процедура коррекции числа:</div><div class="code_line">&nbsp;убирает незначемые нулевые элементы с конца .data}</div><div class="code_line">Procedure HICorrection(Var op:THugeInt);</div><div class="code_line">Var i,sg:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;if op.data &#60;&#62; nil then //or op.flag&#60;&#62;0</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; if op.flag&#60;0 then sg:=-1 else sg:=1;</div><div class="code_line">&nbsp;&nbsp; i:=length(op.data)-1;</div><div class="code_line">&nbsp;&nbsp; while (i&#62;0)and(op.data[i]=0) do Dec(i); //пока не первый и равен нулю</div><div class="code_line">&nbsp;&nbsp; SetLength(op.data,i+1);</div><div class="code_line">&nbsp;&nbsp; op.flag:=length(op.data)*sg;</div><div class="code_line">&nbsp;end;</div><div class="code_line">End;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция сдвига разрядов в старшую сторону}</div><div class="code_line">Function HIShl(const op:THugeInt; n:integer):THugeInt;</div><div class="code_line">Var i,sg:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if n&#60;0 then n:=0;</div><div class="code_line">&nbsp;&nbsp;if op.flag&#60;0 then sg:=-1 else sg:=1;</div><div class="code_line">&nbsp;&nbsp;result.flag:=abs(op.flag)+n*sg;</div><div class="code_line">&nbsp;&nbsp;SetLength(result.data,abs(result.flag));</div><div class="code_line">&nbsp;&nbsp;for i:=0 to abs(op.flag)-1 do result.data[i+n]:=op.data[i];</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
4. Функции сравнения - так-же служат вспомогательными.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{функция сравнения по модулю, нужна для некоторых операций}</div><div class="code_line">{возвращает: 1 if |op1|&#62;|op2|; 0 if |op1|=|op2|; -1 if |op1|&#60;|op2|}</div><div class="code_line">{!!!доработать если операнды=nil}</div><div class="code_line">Function HIModCompare(Const op1, op2:THugeInt):integer;</div><div class="code_line">Var i,r:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#62;abs(op2.flag) then r:=1;</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#60;abs(op2.flag) then r:=-1;</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)=abs(op2.flag) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=abs(op1.flag)-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (i&#62;=0)and(op1.data[i]=op2.data[i]) do Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i&#60;0 then r:=0 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#62;op2.data[i] then r:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#60;op2.data[i] then r:=-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">result:=r;</div><div class="code_line">End;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{функция сравнения с учетом знака}</div><div class="code_line">{возвращает: 1 if op1&#62;op2; 0 if op1=op2; -1 if op1&#60;op2}</div><div class="code_line">{!!!доработать если операнды=nil}</div><div class="code_line">Function HICompare(Const op1, op2:THugeInt):integer;</div><div class="code_line">Var i,r:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;if op1.flag&#62;op2.flag then r:=1;</div><div class="code_line">&nbsp;&nbsp;if op1.flag&#60;op2.flag then r:=-1;</div><div class="code_line">&nbsp;&nbsp;if op1.flag=op2.flag then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=abs(op1.flag)-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (i&#62;=0)and(op1.data[i]=op2.data[i]) do Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i&#60;0 then r:=0 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#62;op2.data[i] then r:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#60;op2.data[i] then r:=-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.flag&#60;0 then r:=r*-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">result:=r;</div><div class="code_line">End;</div></ol></div></div></div></div><br>
<br>
5. И основные арифметические функции:<br>
Сложение и вычитание:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция сложения по модулю}</div><div class="code_line">Function HIModAdd(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len,lenmax:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of longword absolute t;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//возьмем число за основу</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#60;abs(op2.flag) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op1.flag); lenmax:=abs(op2.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end else //abs(op1.flag)&#62;=abs(op2.flag)</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op2.flag); lenmax:=abs(op1.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//учтем значение последнего переноса</div><div class="code_line">&nbsp;&nbsp;if t&#62;$FFFFFFFF then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;lenmax:=lenmax+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax);</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data[lenmax-1]:=cr[1];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result.flag:=lenmax; //длина результата</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция вычетания по модулю}</div><div class="code_line">{result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">Function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;len,rif:integer;</div><div class="code_line">&nbsp;&nbsp;P2:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result.data:=nil;</div><div class="code_line">&nbsp;&nbsp;result.flag:=0;</div><div class="code_line">&nbsp;&nbsp;//проверка, если |op1| &#62;= |op2|</div><div class="code_line">&nbsp;&nbsp;rif:=HIModCompare(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if rif&#62;=0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp; P2.data:=Copy(op2.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P2.data,len); P2.flag:=len;</div><div class="code_line">//начинаем вычитане</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,P2.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,op1 // ESI &#60;- указатель на op1 (thx to leo!)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,[ESI+THugeInt.data] // ESI &#60;- указатель на op1.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLC</div><div class="code_line">@@1: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,[EDI]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EAX</div><div class="code_line">end;</div><div class="code_line">HICorrection(P2);</div><div class="code_line">result.data:=Copy(P2.data);</div><div class="code_line">result.flag:=P2.flag;</div><div class="code_line">end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Теперь с учетом положительных и отрицательных знаков:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция сложения со знаком}</div><div class="code_line">Function HIAdd(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var cmp:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;cmp:=HIModCompare(op1,op2);</div><div class="code_line">&nbsp;if cmp&#60;0 then</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op2,op1);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op2,op1);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op2,op1);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op2,op1);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;end else</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op1,op2);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op1,op2);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция вычитания со знаком}</div><div class="code_line">Function HISub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var cmp:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;cmp:=HIModCompare(op1,op2);</div><div class="code_line">&nbsp;if cmp&#60;0 then</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op2,op1);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op2,op1);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op2,op1);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op2,op1);</div><div class="code_line">&nbsp;end else</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#62;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#62;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModAdd(op1,op2);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (op1.flag&#60;0)and(op2.flag&#60;0) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; result:=HIModSub(op1,op2);</div><div class="code_line">&nbsp;&nbsp; result.flag:=result.flag*(-1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Умножение и деление:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция умножения по модулю}</div><div class="code_line">Function HIModMul(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,j,len1,len2:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of longword absolute t;</div><div class="code_line">&nbsp;&nbsp;rp,r:THugeInt; //rp - is precedent result of multiply</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;len1:=abs(op1.flag);</div><div class="code_line">&nbsp;&nbsp;len2:=abs(op2.flag);</div><div class="code_line">&nbsp;&nbsp;//begin rp:=0;</div><div class="code_line">&nbsp;&nbsp;rp.flag:=1; SetLength(rp.data,rp.flag);</div><div class="code_line">&nbsp;&nbsp;rp.data[rp.flag-1]:=0; //end rp:=0;</div><div class="code_line">&nbsp;&nbsp;j:=0;</div><div class="code_line">&nbsp;&nbsp;while j&#60;len2 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=0; t:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//begin r:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(r.data,0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(r.data,len1+j+1); //size of op1.data + shift + 1 elem of .data</div><div class="code_line">&nbsp;&nbsp; &nbsp;//end r:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;r.flag:=0+j;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while i&#60;len1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op2.data[j])*int64(op1.data[i])+t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(r.flag); //SetLength(r.data,r.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;r.data[r.flag-1]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(r.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;r.data[r.flag-1]:=t;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//Add r with rp</div><div class="code_line">&nbsp;&nbsp; &nbsp;r:=HIModAdd(r,rp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;//begin rp:=r;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rp.flag:=r.flag; SetLength(rp.data,rp.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rp.data:=Copy(r.data); //end rp:=r;</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(j);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;HICorrection(rp); // убирает незначемые нулевые элементы из массива числа</div><div class="code_line">&nbsp;&nbsp;result:=rp;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция деления по модулю без остатка op1 DIV op2}</div><div class="code_line">{разряд результата угадывается по методу дихотомии}</div><div class="code_line">Function HIModDiv(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len1:integer;</div><div class="code_line">&nbsp;&nbsp;r,t,y,rHI:THugeInt;</div><div class="code_line">&nbsp;&nbsp;rk:longword;</div><div class="code_line">&nbsp;&nbsp;base32,r64,x1,x2:Int64;</div><div class="code_line">begin</div><div class="code_line">&nbsp;//учтем деление на ноль!</div><div class="code_line">&nbsp;&nbsp;t.flag:=1; SetLength(t.data,t.flag); // t=0;</div><div class="code_line">&nbsp;&nbsp;t.data[t.flag-1]:=0;</div><div class="code_line">&nbsp;if HICompare(t,op2)&#60;&#62;0 then //op2&#60;&#62;0 ? //иначе result=nil &#60;=&#62; бесконечность</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;base32:=0000000; //2^32</div><div class="code_line">&nbsp;&nbsp;len1:=abs(op1.flag); //&quot;лишнее наследство&quot; //вобщем: проход начнем со старших разрядов делимого,</div><div class="code_line">&nbsp;&nbsp;i:=len1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//добавляя в промежуточное делимое по одному разряду справа...</div><div class="code_line">&nbsp;&nbsp;r.flag:=0; SetLength(r.data,r.flag); // r=nil обнуляем часное</div><div class="code_line">&nbsp;&nbsp;t.flag:=0; SetLength(t.data,t.flag); // t=nil обнуляем промежуточное делимое</div><div class="code_line">&nbsp;&nbsp;while i&#62;0 do &nbsp; &nbsp; &nbsp; &nbsp;//...пока не дойдем до последнего разряда из делимого!</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=HIShl(t,1); &nbsp; &nbsp;//Т.е. в промежуточном делимом сдвигаем разряды влево (умножаем на базу 2^32),</div><div class="code_line">&nbsp;&nbsp; &nbsp;HICorrection(t); &nbsp;//убеждаемся что после такой процедуры неокажется &quot;левых&quot; нолей,</div><div class="code_line">&nbsp;&nbsp; &nbsp;t.data[0]:=op1.data[i-1]; //и &quot;прибавляем&quot; разряд справа от делимого.</div><div class="code_line">&nbsp;&nbsp; &nbsp;//gues r[k] - начинаем угадывание разряда в часном (макс.подх.знач.) по дихотомии...</div><div class="code_line">&nbsp;&nbsp; &nbsp;x1:=0; x2:=base32; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//...в отрезке 0..2^32</div><div class="code_line">&nbsp;&nbsp; &nbsp;r64:=(x1+x2) div 2; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //делим отрезок на две половины</div><div class="code_line">&nbsp;&nbsp; &nbsp;rk:=Int64Rec(r64).Lo; &nbsp; &nbsp; &nbsp; //rk и есть текущий разряд в часном и = только что вычесленной середине отрезка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;rHI.flag:=1; SetLength(rHI.data,rHI.flag); //временная переменная THugeInt для rk</div><div class="code_line">&nbsp;&nbsp; &nbsp;while x1&#60;&#62;rk do &nbsp; //будим разделять отрезки пока x1&#60;&#62;rk</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; rHI.data[0]:=rk;</div><div class="code_line">&nbsp;&nbsp; &nbsp; y:=HIModMul(rHI,op2);//rk*делитель</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//теперь проверим в каком отрезке находится</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//максимально подходящее значение для rk (текущего разряда часного)</div><div class="code_line">&nbsp;&nbsp; &nbsp; if HICompare(t,y)&#62;=0 then x1:=rk else x2:=rk; //If t&#62;=y Then [значение в старшем отр.] else [младшем]</div><div class="code_line">&nbsp;&nbsp; &nbsp; r64:=(x1+x2) div 2; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //и выбраный отрезок снова на пополам</div><div class="code_line">&nbsp;&nbsp; &nbsp; rk:=Int64Rec(r64).Lo; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //rk=середина отрезка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rHI.data[0]:=rk;</div><div class="code_line">&nbsp;&nbsp; &nbsp;y:=HIModMul(rHI,op2); // y=[текущий разряд часного]*[делитель]</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=HIModSub(t,y); &nbsp; &nbsp; // [промежуточное делимое]=[промежуточное делимое]-y</div><div class="code_line">&nbsp;&nbsp; &nbsp;HICorrection(t); &nbsp; &nbsp; &nbsp;// убираем &quot;левые&quot; ноли, если имеются.</div><div class="code_line">&nbsp;&nbsp; &nbsp;r:=HIShl(r,1); &nbsp; &nbsp; &nbsp; &nbsp;// фиксируем часное умножая его на базу</div><div class="code_line">&nbsp;&nbsp; &nbsp;r.data[0]:=rk; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;и &quot;прибавим&quot; только что вычеслиный разряд</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec(i); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // опускаем следующий разряд делимого справа к промежуточному</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;HICorrection(r); &nbsp;// в результате могут оказаться ноли и мы их почистим кроме значемого</div><div class="code_line">&nbsp;end else //if op2=0 =&#62; r=nil ! or infinite (см. в начало)</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;r.flag:=0; SetLength(r.data,r.flag); // r=nil</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result:=r;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Теперь со знаком:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция умножения со знаком}</div><div class="code_line">Function HIMul(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var f1,f2,m:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;f1:=op1.flag;</div><div class="code_line">&nbsp;&nbsp;f2:=op2.flag;</div><div class="code_line">&nbsp;&nbsp;m:=0;</div><div class="code_line">&nbsp;&nbsp;if (f1&#62;0)and(f2&#62;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; if (f1&#60;0)and(f2&#60;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (f1&#62;0)and(f2&#60;0) then m:=-1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (f1&#60;0)and(f2&#62;0) then m:=-1;</div><div class="code_line">&nbsp;&nbsp;result:=HIModMul(op1,op2);</div><div class="code_line">&nbsp;&nbsp;result.flag:=result.flag*m;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{Функция деления op1 DIV op2 со знаком}</div><div class="code_line">Function HIDiv(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var f1,f2,m:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;f1:=op1.flag;</div><div class="code_line">&nbsp;&nbsp;f2:=op2.flag;</div><div class="code_line">&nbsp;&nbsp;m:=0;</div><div class="code_line">&nbsp;&nbsp;if (f1&#62;0)and(f2&#62;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; if (f1&#60;0)and(f2&#60;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (f1&#62;0)and(f2&#60;0) then m:=-1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (f1&#60;0)and(f2&#62;0) then m:=-1;</div><div class="code_line">&nbsp;&nbsp;result:=HIModDiv(op1,op2);</div><div class="code_line">&nbsp;&nbsp;result.flag:=result.flag*m;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Navi1982</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=305393&amp;view=findpost&amp;p=2612689</guid>
        <pubDate>Fri, 04 Jun 2010 15:52:12 +0000</pubDate>
        <title>[Delphi] Модуль Длинной Арифметики.</title>
        <link>https://forum.sources.ru/index.php?showtopic=305393&amp;view=findpost&amp;p=2612689</link>
        <description><![CDATA[Navi1982: В этой теме хотелось бы собрать готовые реализации и интересные идеи тех или иных алгоритмов, так или иначе связанных с вычислениями очень, очень-очень больших чисел&#33;... Т.е. фактически было бы здорово собрать воедино комплекс решений в качестве одного модуля на языке <strong class='tag-b'>Delphi (7)</strong>.<br>
<br>
Хотелось бы попросить участников данной темы придерживатся некоторых правил:<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">1. Свои реализации и их улучшения, по возможности, <em class='tag-i'>писать, изменять и дополнять в <span class='tag-u'>единном посте</span></em>. Исключениями могут быть кардинально иные принцыпы реализации алгоритмов.<br>
2. Было бы гораздо интересней, если <em class='tag-i'>перед каждым алгоритмом будет дано <span class='tag-u'>теоретическое объяснение</span></em>, поясняющие принцып его работы.<br>
3. Просьба тему <span class='tag-u'>не засорять коментариями</span>, а лучше <span class='tag-u'>авторам постов создать отдельную тему</span> где будет обсуждатся его идея и коды, а также история всех улучшений и модификаций. А затем <span class='tag-u'>выносить сюда последний наиболее шустрый вариант</span> (или просто ссылку).</span><br>
<br>
Ниже будет приведено оглавление лучших идей с именами их авторов и с ссылкой на их пост.<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'>ОГЛАВЛЕНИЕ</span><br>
<br>
1. <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=305393&view=findpost&p=2612710' target='_blank'>THugeInt - конвертирование, сравнение, сложение, вычетание, умножение, деление</a><br>
От <strong class='tag-b'>Navi1982</strong>. <em class='tag-i'>Статус - незавершен, код - не документирован, скорость - частично оптимизирован</em>.<br>
Соавторы: <em class='tag-i'><strong class='tag-b'>sCreator</strong></em>, <em class='tag-i'><strong class='tag-b'>Bug Hunter</strong></em>.]]></description>
        <author>Navi1982</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	