# -*- coding: utf-8 -*- # # Script to generate in English and French, graphs for the # birthday problem. # # ************************************************************** # http://en.wikipedia.org/wiki/Birthday_problem # From Wikipedia, the free encyclopedia: # In probability theory, the birthday problem or birthday # paradox concerns the probability that, in a set of n # randomly chosen people, some pair of them will have the # same birthday. By the pigeonhole principle, the probability # reaches 100% when the number of people reaches 367 # (since there are 366 possible birthdays, including February # 29). However, 99% probability is reached with just 57 people, # and 50% probability with 23 people. These conclusions are # based on the assumption that each day of the year (except # February 29) is equally probable for a birthday. # # The mathematics behind this problem led to a well-known # cryptographic attack called the birthday attack, which # uses this probabilistic model to reduce the complexity # of cracking a hash function. # # Text under the # Creative Commons Attribution-ShareAlike License # ************************************************************** # # # Guillaume Jacquenot # 2012/12/16 from pylab import * import numpy as np def makePlot( generateEnglishPlot = True, outputFilename = r'Birthday_paradox.svg', useYLogScale = False): N=91 n = np.arange(float(N)) pbar=np.exp(-n* (n-1) / (2.0*365.0)) p=1.0-pbar n05 = 0.5*(1.0+np.sqrt(1-8.0*365.0*np.log(1.0-0.5))) plot([n05,n05],[0.0,0.5],c='k', linestyle='--') plot([0.0,n05],[0.5,0.5],c='k', linestyle='--') text(23.5,0.02,' ~23') if generateEnglishPlot: plot(n,p ,c='r',label = unicode('Probability of a pair', 'utf8')) plot(n,pbar,c='b',label = unicode('Probability of no matching pair', 'utf8')) else: plot(n,p ,c='r',label = unicode('Probabilité de coïncidence', 'utf8')) plot(n,pbar,c='b',label = unicode('Probabilité de non-coïncidence', 'utf8')) legend(loc='right') xlim(0, N) if useYLogScale: ylim(1e-6, 1) ax = gca() ax.set_yscale('log') else: ylim(0, 1) yticks([0.0,0.2,0.4,0.5,0.6,0.8,1.0]) xticks(range(0, N, 10)) grid(True, ls='-', c='#a0a0a0') if generateEnglishPlot: xlabel('Number of people') ylabel('Probability') else: xlabel('Nombre de personnes') ylabel(unicode('Probabilité', 'utf8')) savefig(outputFilename) show() makePlot(generateEnglishPlot = True, outputFilename = r'Birthday_paradox.svg') makePlot(generateEnglishPlot = False, outputFilename = r'Paradoxe_anniversaire.svg')