Writing a small example in C using the bignum library in openssl (used by the Erlang crypto driver) shows that the result there is 1 as well.<div><br></div><div><div>#include <stdio.h></div><div>#include <openssl/crypto.h></div>
<div>#include <openssl/bn.h></div><div><br></div><div>int main(int argc, char *argv[])</div><div>{</div><div>        static const char b[] = "-2";</div><div>        static const char e[] = "3";</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>static const char m[] = "3";</div><div><br></div><div>        BIGNUM *bnb = NULL;</div><div>        BIGNUM *bne = NULL;</div><div>        BIGNUM *bnm = NULL;</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>BIGNUM *res = BN_new();</div><div><br></div><div>        BN_CTX *ctx = BN_CTX_new();</div><div><br></div><div>        BN_dec2bn(&bnb, b); /* convert the string to BIGNUM */</div>
<div>        BN_dec2bn(&bne, e);</div><div>        BN_dec2bn(&bnm, m);</div><div><br></div><div>        BN_mod_exp(res, bnb, bne, bnm, ctx); </div><div><br></div><div>        char *result_str = BN_bn2dec(res); /* convert the res BIGNUM to string */</div>
<div><br></div><div>        printf("%s\n", result_str);</div><div><br></div><div>        OPENSSL_free(result_str);</div><div><br></div><div>        BN_free(bnb);</div><div>        BN_free(bne);</div><div>        BN_free(bnm);</div>
<div>        BN_CTX_free(ctx);</div><div><br></div><div>        return 0;</div><div>}</div><div><br></div><div><div>$ gcc -o bn -lcrypto bn.c</div><div>$ ./bn</div><div>1</div></div><div><br></div><div>/Jesper Pettersson</div>
<div>Klarna AB</div><div><br></div><div class="gmail_quote">On Sat, May 28, 2011 at 8:22 PM, Hanfei Shen <span dir="ltr"><<a href="mailto:qqshfox@gmail.com">qqshfox@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi all,<br><br>As the doc says:<br><br>mod_exp(N, P, M) -> Result<br><br>Types:<br>N, P, M, Result = Mpint<br>Mpint = binary()<br><br>This function performs the exponentiation N ^ P mod M, using the crypto library.<br>
<br>
Now, assume: N = -2, P = 3, M = 3<br>Then: N ^ P mod M = (-2) ^ 3 mod 3<br>                  = (-8) mod 3<br>                  = (-3) * 3 + 1<br>               or = (-3) * 2 + (-2)<br>So: the remainder should be 1 or -2<br>

(Remainder, From Wikipedia, <a href="http://en.wikipedia.org/wiki/Remainder" target="_blank">http://en.wikipedia.org/wiki/Remainder</a>)<br><br>But I got a TWO from crypto:mod_exp/3... Is there some wrong...?<br>And I did more tests with erlang, python and ruby.<br>

The result:<br><br>Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]<br><br>Eshell V5.8.3  (abort with ^G)<br>1> crypto:mod_exp(-2, 3, 3).<br>2<br>2> crypto:mod_exp(2, 3, 3).<br>

2<br>3> crypto:mod_exp(-2, 3, -3).<br>1<br>4> crypto:mod_exp(2, 3, -3).<br>8<br><br>Python 2.7.1 (r271:86832, Mar 25 2011, 15:07:46)<br><br>In [1]: pow(-2, 3, 3)<br>Out[1]: 1<br><br>In [2]: pow(2, 3, 3)<br>Out[2]: 2<br>

<br>In [3]: pow(-2, 3, -3)<br>Out[3]: -2<br><br>In [4]: pow(2, 3, -3)<br>Out[4]: -1<br><br>Welcome to IRB. You are using ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]. Have fun ;)<br>irb(main):001:0> (-2) ** 3 % 3<br>

1<br>irb(main):002:0> 2 ** 3 % 3<br>2<br>irb(main):003:0> (-2) ** 3 % (-3)<br>-2<br>irb(main):004:0> 2 ** 3 % (-3)<br>-1<br><br><br>Regards,<br><font color="#888888">Hanfei<br>
</font><br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br>Jesper Pettersson<br><br>Klarna AB<br>Norra Stationsgatan 61<br>113 43 Stockholm, Sweden<br>Tel:         +46 8 - 120 120 00<br>Mob:       +46 70 - 001 27 25<br>Fax:        +46 8 - 120 120 99<br>
E-mail:     <a href="mailto:jesper.pettersson@klarna.com">jesper.pettersson@klarna.com</a><br>Web:        <a href="http://www.klarna.com">www.klarna.com</a><br>
</div>