Facebook Sharer
选择您要替换的背景颜色:
【农历新年】背景图片:
个性化设定
 注册  找回密码
查看: 2491|回复: 11
打印 上一主题 下一主题

(A ^ B) % C

[复制链接]

31

主题

0

好友

1228

积分

黄金长老

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

跳转到指定楼层
1#
发表于 2010-4-28 11:29 PM |只看该作者 |倒序浏览
本帖最后由 ~Zero 于 2010-4-30 05:52 PM 编辑

以免有人看不懂,
^ 是次方的意思. 6 ^ 2 = 6 的平方 = 36
% 是 modulus. 就是余数. 23 % 10 = 23 除 10 的余数 = 3

如果我的 A 和 B 数目都有可能很大, 甚至一个 long 都装不下,
例如:
A = 1111
B = 2222
C = 3333
那么 A ^ B = 1111 ^ 2222. 不能用平常的方法来算, 有什么办法解决?

我目前是用这个概念的:
(A ^ B) % C = (A^2 % C) ^ (B/2) % C
然后一直 recursion 到 B/2 = 1 为止.

有没有更好, 更快, 还是更容易的方法?




收藏收藏0

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

2#
发表于 2010-4-30 02:26 PM |只看该作者
以免有人看不懂,
^ 是次方的意思. 6 ^ 2 = 6 的平方 = 36
% 是 modulus. 就是余数. 23 % 10 = 23 除 10  ...
~Zero 发表于 2010-4-28 11:29 PM



呃~~~ 在我概念上我會改成這樣计算, 只是是否正确就你自己去測試了,在某些條件下也許會超出范围吧

  1. ((A % C) ^ B) % C
复制代码


回复

使用道具 举报

31

主题

0

好友

1228

积分

黄金长老

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

3#
发表于 2010-4-30 05:54 PM |只看该作者
依你的方法,在我给的

A = 1111
B = 2222
C = 3333

根本解决不了。

((A % C) ^ B) % C
= ((1111 % 3333) ^ 2222) % 3333
= (1111 ^ 2222) % 3333 <-- 做不下了,打回原形。


回复

使用道具 举报

31

主题

0

好友

1228

积分

黄金长老

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

4#
发表于 2010-4-30 06:00 PM |只看该作者
我的方法,供参考。(java)
听我老师说还有更容易的方法,还给提示说把 p 弄成 binary。

  1.     // INPUT: input, p, n
  2.     // OUTPUT: output
  3.     // ALGORITHM: output = (input ^ p) % n
  4.     public static int pow_mod(int input, int p, int n) {
  5.         if (p == 0)
  6.             return 1;
  7.         else if (p == 1)
  8.             return input;
  9.         else if (p == 2)
  10.             return (int)Math.pow(input, 2) % n;
  11.         else {
  12.             if ((p % 2) == 1)
  13.                 return (input * pow_mod((int)Math.pow(input, 2)%n, (p-1)/2, n)) % n;
  14.             else
  15.                 return pow_mod((int)Math.pow(input, 2)%n, p/2, n) % n;
  16.         }
  17.     }
复制代码


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

5#
发表于 2010-5-1 03:28 AM |只看该作者
本帖最后由 Super-Tomato 于 2010-5-1 03:33 AM 编辑
依你的方法,在我给的

A = 1111
B = 2222
C = 3333

根本解决不了。

((A % C) ^ B) % C
= ((1 ...
~Zero 发表于 2010-4-30 05:54 PM


抱歉, 可能我沒寫清楚我所表達的意思

(A^2 % C) ^ (B/2) % C

因為理論上只要使用者輸入 A 為你數值型態的 MAX(9223372036854775807) 那麼只要一執行必定會出錯, 所以簡單來說先把 A % C 後所得的 A 代入你的公式會比較能夠減少溢出的機率


回复

使用道具 举报

31

主题

0

好友

1228

积分

黄金长老

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

6#
发表于 2010-5-2 11:46 PM |只看该作者
其实, 最大的问题不是 A, 是 B.
就算 A = 2 罢了, B 只要上千就算不出了.

这是 encryption 里面的其中一个步骤, 我可以把 A 和 B 控制在一定的范围内 (几位数的 block size).
但是不可以太小, 不然 encryption 就没意义了.
而且, 如果 user 输入 int 的最大值, 我可以勉勉强强把 result 存在 long 或 double 里面.
最难解决的问题是, B 和 A 是成正比的. 当 A 越大, B 就会越大. 但是 A 不可以太小, 4 位数已经算太小了.


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

7#
发表于 2010-5-3 12:51 AM |只看该作者
其实, 最大的问题不是 A, 是 B.
就算 A = 2 罢了, B 只要上千就算不出了.

这是 encryption 里面的其中一 ...
~Zero 发表于 2010-5-2 11:46 PM



應該是 looping 因計算太過频繁而當掉的問題,而我剛要測試你說的 binary,但想想也最多只能到 64bits 啊....
回到你最初學習数学時候的方式就容易许多了,因為這系統没安裝 Java 所以我簡單用了 Javascript 來測試我所提到理论

演示


回复

使用道具 举报

31

主题

0

好友

1228

积分

黄金长老

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

8#
发表于 2010-5-3 01:11 AM |只看该作者
演示没有东西的?

binary 是没有限制 64-bit 还是什么的, 可以用 String 或 int[] 来存.
这个方法我不是很清楚, 要 google 也不知道什么关键字.
我再翻翻书研究研究. 知道了再发上来分享.


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

9#
发表于 2010-5-3 01:15 AM |只看该作者
本帖最后由 Super-Tomato 于 2010-5-3 01:27 AM 编辑
演示没有东西的?

binary 是没有限制 64-bit 还是什么的, 可以用 String 或 int[] 来存.
这个方法我不是 ...
~Zero 发表于 2010-5-3 01:11 AM



多亏我們有为的 ISP, 我上傳速度不到50kbps, 剛剛才上傳好


p/s: http://java.sun.com/docs/books/t ... olts/datatypes.html
String 所储存的最大空間是程式所建立的 4GB ,并非无限
如果你真的有空去寫 2's complement 的計算的話... 我覺得倒不如做些其他的


回复

使用道具 举报

31

主题

0

好友

1228

积分

黄金长老

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

10#
发表于 2010-5-3 01:29 AM |只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

JBTALKS.CC |联系我们 |隐私政策 |Share

GMT+8, 2024-10-25 01:30 PM , Processed in 0.103777 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Ultra High-performance Dedicated Server powered by iCore Technology Sdn. Bhd.
Domain Registration | Web Hosting | Email Hosting | Forum Hosting | ECShop Hosting | Dedicated Server | Colocation Services
本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved
合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部