﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-WHy so serious?-随笔分类-Algorithm</title><link>http://www.cppblog.com/tabmood/category/11990.html</link><description>太阳下早已没有新鲜事</description><language>zh-cn</language><lastBuildDate>Tue, 06 Oct 2009 06:40:41 GMT</lastBuildDate><pubDate>Tue, 06 Oct 2009 06:40:41 GMT</pubDate><ttl>60</ttl><item><title>在GF(p)中求乘法逆元</title><link>http://www.cppblog.com/tabmood/archive/2009/10/06/97938.html</link><dc:creator>Eleven</dc:creator><author>Eleven</author><pubDate>Tue, 06 Oct 2009 06:16:00 GMT</pubDate><guid>http://www.cppblog.com/tabmood/archive/2009/10/06/97938.html</guid><wfw:comment>http://www.cppblog.com/tabmood/comments/97938.html</wfw:comment><comments>http://www.cppblog.com/tabmood/archive/2009/10/06/97938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tabmood/comments/commentRss/97938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tabmood/services/trackbacks/97938.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">在看密码学的书时遇到的问题，求阶为p的有限域的乘法逆元。<br>GF(p)的概念就不讲了。乘法逆元么可以这样说，a关于m的乘法逆元就是使等式：a&#183;b = 1 (mod m) ，成立的b。<br>开始我想要么就强搜，也用不了一次遍历。后来看了书上更简单的方法，运用的是辗转相除的思想，巧妙的进行方程的转化，过程是这样的。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">(A1,&nbsp;A2,&nbsp;A3)&nbsp;</span><span style="COLOR: #000000">&lt;-</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;M);&nbsp;(B1,&nbsp;B2,&nbsp;B3)</span><span style="COLOR: #000000">&lt;-</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;B)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;B3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;A3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;gcd(m,&nbsp;b);&nbsp;no&nbsp;inverse<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;B3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;B3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;gcd(m,&nbsp;b);&nbsp;B2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b`&nbsp;mod&nbsp;m<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Q&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;A3&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;B3<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>(T1,&nbsp;T2,&nbsp;T3)&nbsp;</span><span style="COLOR: #000000">&lt;-</span><span style="COLOR: #000000">&nbsp;(A1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">QB1,&nbsp;A2</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">QB2,&nbsp;A3</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">QB3)<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>(A1,&nbsp;A2,&nbsp;A3)&nbsp;</span><span style="COLOR: #000000">&lt;-</span><span style="COLOR: #000000">&nbsp;(B1,&nbsp;B2,&nbsp;B3)<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>(B1,&nbsp;B2,&nbsp;B3)&nbsp;</span><span style="COLOR: #000000">&lt;-</span><span style="COLOR: #000000">&nbsp;(T1,&nbsp;T2,&nbsp;T3)<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">goto</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span></div>
</span><span style="FONT-SIZE: 10pt">其中A3和B3是gcd进行操作的主要参数。注意到求乘法逆元，那么m和b肯定互质。那么最后有gcd(m, b)=1，即B3=0，并且A3=1。因此在上一步有B3=1，那么：<br>mB1 + bB2 = B3<br>mB1 + bB2 =1<br>&nbsp;&nbsp;&nbsp;bB2 = 1 - mB1<br>&nbsp;&nbsp;&nbsp;bB2 = 1 (mod m)<br>所以此时的B2就为b的乘法逆元，全部过程利用辗转相除自然简化了不少。<br>推广一下可以求出b`，使bb` = k (mod m)，其中k为小余m的任意数。很简单，只要继续沿着此方法，算出bB2 = 1 (mod m)中的B2之后再乘以一个k (mod m)就是b`了。<br></span>
<img src ="http://www.cppblog.com/tabmood/aggbug/97938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tabmood/" target="_blank">Eleven</a> 2009-10-06 14:16 <a href="http://www.cppblog.com/tabmood/archive/2009/10/06/97938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>