Entropy
Shannon Entropy
Codes from: http://rosettacode.org/wiki/Entropy
(function(shannon) { // Create a dictionary of character frequencies and iterate over it. function process(s, evaluator) { var h = Object.create(null), k; s.split('').forEach(function(c) { h[c] && h[c]++ || (h[c] = 1); }); if (evaluator) for (k in h) evaluator(k, h[k]); return h; }; // Measure the entropy of a string in bits per symbol. shannon.entropy = function(s) { var sum = 0,len = s.length; process(s, function(k, f) { var p = f/len; sum -= p * Math.log(p) / Math.log(2); }); return sum; }; })(window.shannon = window.shannon || {}); // Log the Shannon entropy of a string. function logEntropy(s) { console.log('Entropy of "' + s + '" in bits per symbol:', shannon.entropy(s)); } logEntropy('1223334444'); logEntropy('0'); logEntropy('01'); logEntropy('0123'); logEntropy('01234567'); logEntropy('0123456789abcdef');
Output:
Entropy of "1223334444" in bits per symbol: 1.8464393446710154
Entropy of "0" in bits per symbol: 0
Entropy of "01" in bits per symbol: 1
Entropy of "0123" in bits per symbol: 2
Entropy of "01234567" in bits per symbol: 3
Entropy of "0123456789abcdef" in bits per symbol: 4
Math
Birthday attack
生日问题是指,如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。从引起逻辑矛盾的角度来说生日悖论并不是一种悖论,从这个数学事实与一般直觉相抵触的意义上,它才称得上是一个悖论。大多数人会认为,23人中有2人生日相同的概率应该远远小于50%。计算与此相关的概率被称为生日问题,在这个问题之后的数学理论已被用于设计著名的密码攻击方法:生日攻击。
Euler Theorem
当为质数时(费马小定理):
所以
Euler Totient Function
任意给定正整数,小于等于
的正整数之中,有多少个与
构成互质关系,计算这个值的方法就叫做欧拉函数,以
表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以
。
一、
如果,则
。因为1与任何数(包括自身)都构成互质关系。
二、是质数
如果n是质数,则 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
三、是质数的某一个次方,即
(
为质数,
为大于等于1的整数)
比如
四、可以分解成两个互质的整数之积,即
比如
五、任意一个大于1的正整数,都可以写成一系列质数的积
比如
public static BigInteger euler(BigInteger x) { BigInteger res = x; for (BigInteger i = BigInteger.valueOf(2); i.compareTo(x.divide(i)) <= 0; i = i.add(BigInteger.ONE)) { if (x.mod(i).equals(BigInteger.ZERO)) { res = res.divide(i).multiply(i.subtract(BigInteger.ONE)); while (x.mod(i).equals(BigInteger.ZERO)) { x = x.divide(i); } } } if (x.compareTo(BigInteger.ONE) > 0) { res = res.divide(x).multiply(x.subtract(BigInteger.ONE)); } return res; }
Greatest Common Divisor
Modular Multiplicative Inverse
Prime
质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。大于1的自然数若不是素数,则称之为合数。
public static boolean isPrime(BigInteger n) { BigInteger TWO = BigInteger.valueOf(2); BigInteger n_div_2 = n.divide(TWO); for (BigInteger i = TWO; i.compareTo(n_div_2) <= 0; i = i.add(BigInteger.ONE)) { if (n.mod(i).equals(BigInteger.ZERO)) { return false; } } return true; }
Reference
- h
t t p s : / / e n . w i k i p e d i a . o r g / w i k i / B i r t h d a y _ a t t a c k - h
t t p s : / / w w w . q u o r a . c o m / H o w - d o - I - e v a l u a t e - A - B - m o d - 1 0 0 0 0 0 0 0 0 7 - h
t t p : / / w w w . r u a n y i f e n g . c o m / b l o g / 2 0 1 3 / 0 6 / r s a _ a l g o r i t h m _ p a r t _ o n e . h t m l - h
t t p s : / / z h . w i k i p e d i a . o r g / w i k i / 模 反 元 素 - h
t t p s : / / z h . w i k i p e d i a . o r g / w i k i / 欧 拉 定 理 _ ( 数 论 ) - h
t t p s : / / z h . w i k i p e d i a . o r g / w i k i / 欧 拉 函 数 - h
t t p s : / / z h . w i k i p e d i a . o r g / w i k i / 素 数