Friday, July 25, 2014

[Japan life skill] Kinh nghiệm leo núi Tateyama

1. Những thứ cần chuẩn bị

1. Quần dù thể dục
- Hoặc quần nào càng nhẹ càng tốt, đừng dài quá vướng chân
2. Kính mát
- tateyama leo khoảng từ sáng trưa đến 4,5h chiều nên rất nắng
3. Kem chống nắng
- Nhớ giữa các chặng leo bôi lại do kem chống nắng ko giữ đc lâu
4. Giày leo núi
- Ko đc mang giày mới
- Giày đế thiệt nhẹ, đừng nên chọn loại giày đế cao su
- Giày ko thấm nước
5. Áo mưa nhỏ gọn
6. Nước (chừng 2lít)
- Tateyama đi giữa các chặng ko bán nước nên phải chuẩn bị trước
- Lên đỉnh cũng có bán nhưng nhiều người mua rất nhanh hết, ko đến lượt mình
7. Đồ ăn nhẹ (bánh, chocolate)

2. Ko cần chuẩn bị những thứ sau (Tateyama không giống Hakusan hay Fujisan)
- Gậy
- Đèn pin
- Túi ngủ

3. 1 số hình ảnh





[JAIST] All names

- English: Japan Advanced Institute of Science and Technology
- Kanji: 北陸先端科学技術大学院大学
- Hiragana: ほくりくせんたんかがくぎじゅつだいがくいんだいがく
- Katakana: ホクリクセンタンカガクギジュツダイガクインダイガク

Thursday, July 10, 2014

[Research] How to generate n-bit large prime

Way 1: slow

import random
import math
import sys

def rabinMiller(n):
     s = n-1
     t = 0
     while s&1 == 0:
         s = s/2
         t +=1
     k = 0
     while k<128:
         a = random.randrange(2,n-1)
         #a^s is computationally infeasible.  we need a more intelligent approach
         #v = (a**s)%n
         #python's core math module can do modular exponentiation
         v = pow(a,s,n) #where values are (num,exp,mod)
         if v != 1:
             i=0
             while v != (n-1):
                 if i == t-1:
                     return False
                 else:
                     i = i+1
                     v = (v**2)%n
         k+=2
     return True

def isPrime(n):
     #lowPrimes is all primes (sans 2, which is covered by the bitwise and operator)
     #under 1000. taking n modulo each lowPrime allows us to remove a huge chunk
     #of composite numbers from our potential pool without resorting to Rabin-Miller
     lowPrimes =   [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
                   ,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179
                   ,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269
                   ,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367
                   ,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461
                   ,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571
                   ,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661
                   ,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773
                   ,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883
                   ,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997]
     if (n >= 3):
         if (n&1 != 0):
             for p in lowPrimes:
                 if (n == p):
                    return True
                 if (n % p == 0):
                     return False
             return rabinMiller(n)
     return False

def generateLargePrime(k):
     #k is the desired bit length
     r=100*(math.log(k,2)+1) #number of attempts max
     r_ = r
     while r>0:
        #randrange is mersenne twister and is completely deterministic
        #unusable for serious crypto purposes
         n = random.randrange(2**(k-1),2**(k))
         r-=1
         if isPrime(n) == True:
             return n
     return "Failure after "+`r_` + " tries."

print generateLargePrime(1024)
 
Way 2: < n bits (The prime is less than n bits)

from random import randrange, getrandbits
from itertools import repeat

def isProbablePrime(n, t = 7):  
    def isComposite(a):
        #Check if n is composite
        if pow(a, d, n) == 1:
            return False
        for i in range(s):
            if pow(a, 2 ** i * d, n) == n - 1:
                return False
        return True

    assert n > 0
    if n < 3:
        return [False, False, True][n]
    elif not n & 1:
        return False
    else:
        s, d = 0, n - 1
        while not d & 1:
            s += 1
            d >>= 1
    for _ in repeat(None, t):
        if isComposite(randrange(2, n)):
            return False
    return True

def getPrime(n):
    #Get a n-bit prime
    p = getrandbits(n)
    while not isProbablePrime(p):
        p = getrandbits(n)     
    return p