<?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=169662&amp;view=findpost&amp;p=1433005</guid>
        <pubDate>Tue, 30 Jan 2007 06:10:30 +0000</pubDate>
        <title>Алгоритм MOD</title>
        <link>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1433005</link>
        <description><![CDATA[Dethlord: Всем спасибо проблемма решена:<br>Взятие модуля<br><br> <br><br>С этим алгоритмом пришлось изрядно повозиться из-за того, что операция Mod практически нигде не описана. Опять вспоминаем математику:<br><br>A mod A=0<br><br>A mod 1=0<br><br>A mod B=C означает, что существует такое положительное целое число K, что B*K+C=A. C нам надо найти. Что ж, существует очень простой способ: отнимать от A число B до тех пор, пока A&gt;=B. В итоге получим C. Но представьте только, сколько операций вычитания придётся сделать при больших числах&#33;&#33;&#33; Надо как-то оптимизировать вычитание. До сих пор мы не использовали число K. Каким оно может быть? K может быть разложено на произведение чисел. Чем оптимальнее будут выбраны эти числа, тем лучше&#33; Самое лучшее решение, что приходит в голову: выбирать K поразрядно (по степеням 10). Протестируем идею - рассмотрим пару примеров:<br><br>1.       1234 mod 7=2<br><br>2.       1237 mod 70=44           44 mod 7=2<br><br>3.       1237 mod 700=534       534 mod 70=44 44 mod 7=2<br><br> <br><br>Значит, мы можем варьировать значением числа K~B (с определёнными условиями)&#33;<br><br>Воплощаем мысль в алгоритм:<br><br> <br><br>1.       Откинем все частные случаи и тогда получим, что: A&gt;B<br><br>2.       Итак, если A&gt;B:<br><br>3.       Будем умножать B на 10 до тех пор, пока длины чисел A и B не сравняются.<br><br>4.       Если A=B, то mod=0<br><br>5.       Если A&lt;B, то получается, что мы переборщили с умножением -&gt; делим B на 10<br><br>6.       Поочерёдно умножаем B на i=1,2,3,… пока B не станет больше A<br><br>7.       Берём предыдущее число (i), на которое было умножено B, и выполняем A=A-B*i<br><br>8.       Идём на шаг 2<br><br>9.       Результат=A<br><br> <br><br>Возможно, пример поможет понять алгоритм:<br><br> <br><br>356395 mod 37=C, C=?<br><br>A=356395<br><br>B=37<br><br> <br><br>A&gt;B – верно<br><br>Умножаем B на 10, пока длины не сравняются: B=370000<br><br>B&gt;A – с нулями мы переборщили =&gt; B=37000              ** умножили на 1000<br><br>B*1=37000<br><br>B*2=74000<br><br>B*3=111000<br><br>B*4=148000<br><br>B*5=185000<br><br>B*6=222000<br><br>B*7=259000<br><br>B*8=296000<br><br>B*9=333000<br><br>B*10=37000 B&gt;A – верно<br><br>A=A-B*9=356395-333000=23395                                              ** умножили на 9<br><br> <br><br>A=23395<br><br>B=37<br><br> <br><br>A&gt;B – верно<br><br>B=37000 – перебор =&gt; B=3700                                               ** умножили на 100<br><br>B*1=3700<br><br>B*2=7400<br><br>B*3=11100<br><br>B*4=14800<br><br>B*5=18500<br><br>B*6=22200<br><br>B*7=25900 B&gt;A – верно<br><br>A=A-B*6=23395-22200=1195                                       ** умножили на 6<br><br> <br><br>A=1195<br><br>B=37<br><br> <br><br>A&gt;B – верно<br><br> <br><br>B=3700 – перебор =&gt; B=370                                       ** умножили на 10<br><br>B*1=370<br><br>B*2=740<br><br>B*3=1110<br><br>B*4=1480 B&gt;A – верно<br><br>A=A-B*3=1195-1110=85                                                          ** умножили на 3<br><br> <br><br>A=85<br><br>B=37<br><br> <br><br>B=370 – перебор, B=37                                                           ** умножили на 1<br><br>B*1=37<br><br>B*2=74<br><br>B*3=111 B&gt;A – верно<br><br>A=A-B*2=85-74=11                                                     ** умножили на 2<br><br> <br><br>A=11<br><br>B=70<br><br> <br><br>A&lt;B =&gt; C=11<br><br> <br><br>Всего потребовалось: 4 вычитания и 19 сложений (куда пропали умножения, смотрите в исходном коде)<br><br>А если бы мы пользовались простыми вычитаниями, то их потребовалось бы: 9632 штуки&#33;&#33;&#33; Кстати, это и есть число K – целая часть от деления A на B, а ведь из приведённого примера мы можем вычленить это число, если обратим внимание на строки, помеченные **: если выпишем вынесенные числа, то получим: 1000 9 100 6 10 3 1 2. А теперь расставим арифметические знаки: 1000*9+100*6+10*3+1*2=9632. Это свойство используется в алгоритме деления&#33;&#33;&#33;]]></description>
        <author>Dethlord</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432976</guid>
        <pubDate>Tue, 30 Jan 2007 05:06:54 +0000</pubDate>
        <title>Алгоритм MOD</title>
        <link>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432976</link>
        <description><![CDATA[AlexJ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=169662&view=findpost&p=1432951'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dethlord &#064; <time class="tag-quote__quoted-time" datetime="2007-01-30T02:45:08+00:00">30.01.07, 02:45</time></span><div class='quote '>Мне одно не понятно естли это остаток от деления то почему:<br>
5 mod 6=5 когда 5/6=0,83(3)</div></div><br>
5/6=0.83 - это арифметическое деление<br>
операция же MOD<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
The result of the initial division is truncated to an integer-class value, before the remainder is calculated. <br>
</div></div><br>
<br>
Т.е. операция деления производится над целыми числами,<br>
если делитель больше чем делимое, тогда резултат операции MOD будет равен делимому. Или другими словами целое число не может быть разделено больше чем на само себя. 5 mod 149 = 5 ; 5 mod 12345 = 5 ; 9 mod 345 = 9<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
хотя иногда, получается например:<br>
5 mod 4=1 когда 5/4=1,25- естли округлить<br>
</div></div><br>
<br>
Ну здесь помоему все понятно 4 укладывается в 5-ке один раз, и остаток от деления = 1 <br>
<br>
22 mod 5 = 2 (5-ка укладывается полностью в 22 четыре раза, и остаток от деления =2)]]></description>
        <author>AlexJ</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432951</guid>
        <pubDate>Tue, 30 Jan 2007 02:45:08 +0000</pubDate>
        <title>Алгоритм MOD</title>
        <link>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432951</link>
        <description><![CDATA[Dethlord: Мне одно не понятно естли это остаток от деления то почему:<br>5 mod 6=5 когда 5/6=0,83(3)<br>хотя иногда, получается например:<br>5 mod 4=1 когда 5/4=1,25- естли округлить<br>В чем прикол я не пойму обьясните что это за остаток такой интересный?<br>Каков алгоритм?]]></description>
        <author>Dethlord</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432945</guid>
        <pubDate>Tue, 30 Jan 2007 01:40:42 +0000</pubDate>
        <title>Алгоритм MOD</title>
        <link>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432945</link>
        <description><![CDATA[AlexJ: MOD=возвращает остаток от деления между двумя числами.<br><br>на ассемлере<br><br>mov eax,Младший Dword<br>mov edx,старший Dword<br>div src<br>результат<br>quotient is stored in EAX<br>and the remainder in EDX<br><br>так вот remainder(остаток) и есть результат операции MOD<br><br>P.S.<br>фу блин не дочитал саме интересное(для длинных чисел) ну ладно пусть остается может пригодится]]></description>
        <author>AlexJ</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432944</guid>
        <pubDate>Tue, 30 Jan 2007 01:38:12 +0000</pubDate>
        <title>Алгоритм MOD</title>
        <link>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432944</link>
        <description><![CDATA[kl: Подсказки:<ul class="tag-list"><li>a = b | mod m =&gt; a + c = b + c | mod m</li><li>a = b | mod m =&gt; a * c = b * c | mod m</li><li>a = b | mod m =&gt; a^c = b^c | mod m</li></ul>Соответственно, допустим, надо посчитать 201^675 mod 20. В лоб будет тоскливо. Но мы знаем, что 201 mod 20 = 1. Т.е. 201^675 = 1^675 | mod 20. Что равно 1.<br>
В общем случае канешна будет посложнее, но идея, думаю понятна.<br>
<br>
Кстати, если делитель легко факторизуется (что не всегда&#33;), то можно использовать Chinese Remainder Theorem.. Но это уже отдает каким-то шаманством :)]]></description>
        <author>kl</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432937</guid>
        <pubDate>Tue, 30 Jan 2007 00:40:13 +0000</pubDate>
        <title>Алгоритм MOD</title>
        <link>https://forum.sources.ru/index.php?showtopic=169662&amp;view=findpost&amp;p=1432937</link>
        <description><![CDATA[Dethlord: Каков внутренний алгоритм функции MOD.Смысл MOD я понимаю, но мне нужно зделать MOD свой(для длинных чисел).]]></description>
        <author>Dethlord</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	