এটি বিখ্যাত জন্মদিন সমস্যার একটি জেনারালাইজেশন : প্রদত্ত জন ব্যক্তি যারা সম্ভাবনার সেটগুলির মধ্যে এলোমেলোভাবে, অভিন্নভাবে "জন্মদিন" বিতরণ করেছেন, জনের বেশি ব্যক্তি কোনও জন্মদিন ভাগ না করার সুযোগ কী ?n=100d=6m=20
একটি সঠিক গণনা answer (ডাবল স্পষ্টতা থেকে) উত্তর দেয়। আমি তত্ত্বটি স্কেচ করব এবং সাধারণ কোডের মধ্যে asymptotic সময়জ্ঞান হয় যা জন্মদিন খুব বড় সংখ্যার জন্য উপযুক্ত করে তোলে এবং যতক্ষণ যুক্তিসংগত কর্মক্ষমতা উপলব্ধ হাজার হাজার আছে। এই মুহুর্তে, জন্মদিনের প্যারাডক্সটি 2 টিরও বেশি লোকের বাড়ানোয় আলোচিত পয়সন আনুমানিকতার বেশিরভাগ ক্ষেত্রেই ভালভাবে কাজ করা উচিত।এন , মি , ডি । ও ( এন 2 লগ ( ডি ) ) ডি এন0.267747907805267n,m,d.O(n2log(d))dn
সমাধানের ব্যাখ্যা
সাইড ডাইয়ের স্বতন্ত্র রোলগুলির ফলাফলের জন্য সম্ভাব্যতা উত্পন্ন ফাংশন (পিজিএফ) হয়dnd
d−nfn(x1,x2,…,xd)=d−n(x1+x2+⋯+xd)n.
এই ঠিক বার প্রদর্শিত হতে পারে তার সংখ্যা দেয় , i e i i = 1 , 2 , … , d ।xe11xe22⋯xeddieii=1,2,…,d.
বেশী আমাদের সুদ সীমিত কোনো মুখের ভিত্তিতে চেহারাগুলো মূল্যায়নের শামিল কিনা মডিউল আদর্শ দ্বারা উত্পন্ন এই মূল্যায়নটি সম্পাদন করতে, দ্বিপদী তত্ত্বটি পুনরাবৃত্তভাবে প্রাপ্ত করতে ব্যবহার করুনf n I x m + 1 1 , x m + 1 2 , … , x m + 1 d ।mfnIxm+11,xm+12,…,xm+1d.
fn(x1,…,xd)=((x1+⋯+xr)+(xr+1+xr+2+⋯+x2r))n=∑k=0n(nk)(x1+⋯+xr)k(xr+1+⋯+x2r)n−k=∑k=0n(nk)fk(x1,…,xr)fn−k(xr+1,…,x2r)
যখন হয়। লিখন ( পদ), আমরা আছেd=2rf(d)n=fn(1,1,…,1)d
f(2r)n=∑k=0n(nk)f(r)kf(r)n−k.(a)
যখন টি বিজোড় হয়, তখন অভিন্ন পচন ব্যবহার করুনd=2r+1
fn(x1,…,xd)=((x1+⋯+x2r)+x2r+1)n=∑k=0n(nk)fk(x1,…,x2r)fn−k(x2r+1),
দান
f(2r+1)n=∑k=0n(nk)f(2r)kf(1)n−k.(b)
উভয় ক্ষেত্রেই আমরা মডিউল- সমস্ত কিছু হ্রাস করতে যা সহজেই শুরু করা হয়I
fn(xj)≅{xn0n≤mn>mmodI,
পুনরাবৃত্তি জন্য প্রারম্ভিক মান প্রদান,
f(1)n={10n≤mn>m
এই কার্যকরী করে তোলে যে বিভাজন হয় দুটি গ্রুপ একই আকারের মধ্যে ভেরিয়েবল ভেরিয়েবল প্রতিটি এবং সব পরিবর্তনশীল মান নির্ধারণের আমরা কেবল সবকিছু নির্ণয় করা আছে একবার এক দলের জন্য এবং তারপর একত্রিত ফলাফল নেই। এর জন্য পদগুলি পর্যন্ত কম্পিউটিং করা প্রয়োজন, তাদের প্রত্যেকটির সংমিশ্রণের জন্য গণনা প্রয়োজন । এমনকি store সঞ্চয় করার জন্য আমাদের 2 ডি লাগবে না , কারণ গণনা করার সময় কেবল এবং । প্রয়োজনdr1,n+1O(n)f(r)nf(d)n,f(r)nf(1)n
ধাপের মোট সংখ্যা বাইনারি সম্প্রসারণ ডিজিটের সংখ্যার চেয়ে এক কম (যা সূত্র সমান দলে টুকরা বড়, মোট ছাত্র ) প্লাস সম্প্রসারণ মধ্যে বেশী নম্বর (যা বার একটি বিজোড় সব বড়, মোট ছাত্র সূত্র এর প্রয়োগের জন্য মানটির সম্মুখীন হয় । এটি এখনও কেবল পদক্ষেপ।d(a)(b)O(log(d))
ইন R
এক দশক বয়সী ওয়ার্কস্টেশন কাজ 0,007 সেকেন্ডের মধ্যে করা হয়েছিল। কোডটি এই পোস্টের শেষে তালিকাভুক্ত করা হয়েছে। এটি সম্ভাব্যতার চেয়ে লগারিদমগুলি সম্ভাব্যতার চেয়ে বরং সম্ভাব্য ওভারফ্লোগুলি বা অত্যধিক আন্ডারফ্লো এড়াতে ব্যবহার করে। এটি সমাধানের ফ্যাক্টরটি সরিয়ে ফেলা সম্ভব করে তোলে যাতে আমরা সম্ভাব্যতাগুলি বিবেচনা করে এমন গণনাগুলি গণনা করতে পারি।d−n
নোট করুন যে এই প্রক্রিয়াটির ফলস্বরূপ সম্ভাব্যতার পুরো ক্রমটি একবারে গণনা করার ফলস্বরূপ , যা আমাদের সহজেই কীভাবে দিয়ে সম্ভাবনা পরিবর্তন করে তা অধ্যয়ন করতে সক্ষম করে ।f0,f1,…,fnn
অ্যাপ্লিকেশন
সাধারণীকৃত জন্মদিনের সমস্যায় বিতরণটি ফাংশন দ্বারা গণনা করা হয় tmultinom.full
। একমাত্র চ্যালেঞ্জটি এমন লোকের সংখ্যার জন্য একটি উচ্চতর সীমা নির্ধারণে অন্তর্ভুক্ত যারা -কোলিশনের সম্ভাবনা খুব দুর্দান্ত হয়ে ওঠার আগে উপস্থিত থাকতে হবে । নীচের কোডটি নিখুঁত বল দ্বারা এটি করে, ছোট দিয়ে শুরু করে এবং এটি যথেষ্ট বড় না হওয়া পর্যন্ত দ্বিগুণ করে। সম্পূর্ণ গণনাটি সময় নেয় যেখানে হল সমাধান। মাধ্যমে সংখ্যক লোকের জন্য সম্ভাবনার সম্পূর্ণ বিতরণ গণনা করা হয়।m+1nO(n2log(n)log(d))nn
#
# The birthday problem: find the number of people where the chance of
# a collision of `m+1` birthdays first exceeds `alpha`.
#
birthday <- function(m=1, d=365, alpha=0.50) {
n <- 8
while((p <- tmultinom.full(n, m, d))[n] > alpha) n <- n * 2
return(p)
}
উদাহরণ হিসাবে, একটি ভিড়ের মধ্যে ন্যূনতম সংখ্যক লোকের পক্ষে এটির সম্ভাবনা বেশি হওয়ার পক্ষে প্রয়োজনীয়তার চেয়ে বেশি নয় যে তাদের মধ্যে কমপক্ষে আট জন জন্মদিনে ভাগ করে নিন , যেমন গণনা অনুসারে পাওয়া যায় । এটি মাত্র কয়েক সেকেন্ড সময় নেয়। আউটপুট অংশের একটি প্লট এখানে:798birthday(7)
এই সমস্যাটির একটি বিশেষ সংস্করণ 2 টিরও বেশি লোকের কাছে জন্মদিনের প্যারাডক্সকে বাড়ানোর সময় সম্বোধন করা হয়েছে , যা একটি পক্ষীয় মরণের ক্ষেত্রে উদ্বেগ প্রকাশ করে যা খুব বড় সংখ্যক বার ঘূর্ণিত হয়।365
কোড
# Compute the chance that in `n` independent rolls of a `d`-sided die,
# no side appears more than `m` times.
#
tmultinom <- function(n, m, d, count=FALSE) tmultinom.full(n, m, d, count)[n+1]
#
# Compute the chances that in 0, 1, 2, ..., `n` independent rolls of a
# `d`-sided die, no side appears more than `m` times.
#
tmultinom.full <- function(n, m, d, count=FALSE) {
if (n < 0) return(numeric(0))
one <- rep(1.0, n+1); names(one) <- 0:n
if (d <= 0 || m >= n) return(one)
if(count) log.p <- 0 else log.p <- -log(d)
f <- function(n, m, d) { # The recursive solution
if (d==1) return(one) # Base case
r <- floor(d/2)
x <- double(f(n, m, r), m) # Combine two equal values
if (2*r < d) x <- combine(x, one, m) # Treat odd `d`
return(x)
}
one <- c(log.p*(0:m), rep(-Inf, n-m)) # Reduction modulo x^(m+1)
double <- function(x, m) combine(x, x, m)
combine <- function(x, y, m) { # The Binomial Theorem
z <- sapply(1:length(x), function(n) { # Need all powers 0..n
z <- x[1:n] + lchoose(n-1, 1:n-1) + y[n:1]
z.max <- max(z)
log(sum(exp(z - z.max), na.rm=TRUE)) + z.max
})
return(z)
}
x <- exp(f(n, m, d)); names(x) <- 0:n
return(x)
}
উত্তরটি সাথে পাওয়া যায়
print(tmultinom(100,20,6), digits=15)
0,267747907805267