Problem Summary

There are \(N=50\) shots. On shot \(x\), the hit probability depends on an unknown parameter \(q\):

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50.$$

We must find the value of \(q\) for which the probability of getting exactly \(20\) hits is

$$0.02.$$

The final numeric Project Euler answer is intentionally omitted here.

Mathematical Approach

1) Basic constraints on \(q\). To keep every hit probability between \(0\) and \(1\), we need

$$q>50.$$

The expected number of hits is

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}.$$

So even when \(q\downarrow 50\), the mean is already above \(24.5\). Since the target score is only \(20\), we are searching for a left-tail probability.

2) This is a Poisson-binomial distribution. The 50 shots are independent, but the success probabilities are different. Therefore the total number of hits is not binomial; it is a Poisson-binomial random variable.

A useful generating-function view is

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr).$$

The coefficient of \(z^s\) in \(G(z)\) is exactly the probability of finishing with \(s\) hits.

3) Exact DP recurrence. Let \(P_x(s)\) be the probability of having exactly \(s\) hits after the first \(x\) shots. For shot \(x\), either we miss and stay at \(s\), or we hit and come from \(s-1\). Hence

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x.$$

The base conditions are

$$P_0(0)=1,\qquad P_0(s>0)=0.$$

The target function is therefore

$$F(q)=P_{50}(20).$$

This is what exact_score_probability computes.

4) Why a 1D array is enough. At step \(x\), the new value of \(P_x(s)\) depends only on the previous-layer values \(P_{x-1}(s)\) and \(P_{x-1}(s-1)\). So we can update a single array in place by running \(s\) downward:

$$s=x,x-1,\dots,1.$$

That preserves the old layer until it has been used.

5) Tiny worked example. After two shots, the probability of exactly one hit is

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2.$$

This is the same recurrence in miniature: either the first shot hits and the second misses, or the first misses and the second hits.

6) Root search. We need to solve

$$F(q)=0.02.$$

The code first brackets the solution. Its checkpoint verifies that

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

So the desired \(q\) lies strictly between \(52\) and \(53\).

As \(q\) increases, every individual hit probability \(p_x(q)\) increases, so the whole score distribution shifts toward larger totals. Since \(20\) is already well below the mean throughout the relevant range, the exact-\(20\) probability decreases across the bracket. That makes bisection the natural method.

7) Why bisection is reliable here. Once we have an interval \([L,H]\) with

$$F(L)>0.02>F(H),$$

we repeatedly test the midpoint \(M=(L+H)/2\). If \(F(M)\) is still above the target, the root is to the right; otherwise it is to the left. Repeating this around 220 times drives the interval width far below the requested decimal precision.

Complexity Analysis

One evaluation of \(F(q)\) uses the DP over \(50\) shots and score states \(0,\dots,20\), so the cost is

$$O(NS),\qquad N=50,\ S=20,$$

which is tiny. With \(I\) bisection iterations, total time is

$$O(INS),$$

and memory usage is

$$O(S).$$

Numerically, the update is stable because every new value is a convex combination of probabilities in \([0,1]\).

Further Reading

  1. Problem page: https://projecteuler.net/problem=286
  2. Poisson-binomial distribution: https://en.wikipedia.org/wiki/Poisson_binomial_distribution
  3. Bisection method: https://en.wikipedia.org/wiki/Bisection_method

Problemzusammenfassung

Es gibt \(N=50\) Würfe. Beim \(x\)-ten Wurf ist die Trefferwahrscheinlichkeit

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50.$$

Gesucht ist das \(q\), für das die Wahrscheinlichkeit von genau \(20\) Treffern gleich

$$0{,}02$$

ist. Der endgültige Zahlenwert wird hier bewusst nicht ausgeschrieben.

Mathematischer Ansatz

1) Grundbedingung an \(q\). Damit alle Trefferwahrscheinlichkeiten zwischen \(0\) und \(1\) liegen, muss

$$q>50$$

gelten. Der Erwartungswert der Trefferzahl ist

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}.$$

Selbst nahe \(q=50\) liegt der Mittelwert also schon über \(24{,}5\). Das gesuchte Ereignis „genau 20 Treffer“ liegt damit im linken Verteilungsschwanz.

2) Poisson-Binomial-Verteilung. Die Würfe sind unabhängig, aber nicht identisch verteilt. Deshalb entsteht keine gewöhnliche Binomialverteilung, sondern eine Poisson-Binomialverteilung.

Die erzeugende Funktion lautet

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr),$$

und der Koeffizient von \(z^s\) ist die Wahrscheinlichkeit für genau \(s\) Treffer.

3) Exakte DP-Rekursion. Bezeichne \(P_x(s)\) als Wahrscheinlichkeit, nach den ersten \(x\) Würfen genau \(s\) Treffer zu haben. Dann gilt

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x,$$

mit Anfangswerten

$$P_0(0)=1,\qquad P_0(s>0)=0.$$

Die Zielfunktion ist somit

$$F(q)=P_{50}(20).$$

4) Warum ein eindimensionales DP genügt. Jeder neue Zustand braucht nur die alten Werte \(P_{x-1}(s)\) und \(P_{x-1}(s-1)\). Deshalb kann ein einziges Array verwendet werden, wenn \(s\) rückwärts läuft:

$$s=x,x-1,\dots,1.$$

5) Mini-Beispiel. Nach zwei Würfen ist die Wahrscheinlichkeit für genau einen Treffer

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2.$$

Das ist genau dieselbe Rekursion im Kleinen.

6) Bracketing und Bisektion. Gelöst wird

$$F(q)=0.02.$$

Der Checkpoint im Code zeigt

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

Die gesuchte Lösung liegt also sicher zwischen \(52\) und \(53\). Mit wachsendem \(q\) steigen alle Einzelwahrscheinlichkeiten \(p_x(q)\), die Verteilung wandert zu höheren Trefferzahlen, und die Wahrscheinlichkeit von genau \(20\) Treffern sinkt im relevanten Bereich. Daher ist Bisektion hier passend.

7) Warum die Bisektion zuverlässig ist. Hat man ein Intervall \([L,H]\) mit

$$F(L)>0.02>F(H),$$

dann entscheidet der Mittelpunkt \(M=(L+H)/2\), welche Hälfte den Zielwert enthält. Rund 220 Iterationen machen das Intervall wesentlich kleiner als die geforderte Dezimalgenauigkeit.

Komplexitätsanalyse

Eine Auswertung von \(F(q)\) kostet

$$O(NS),\qquad N=50,\ S=20,$$

also sehr wenig. Mit \(I\) Bisektionsschritten ergibt sich insgesamt

$$O(INS)$$

Zeit und

$$O(S)$$

Speicher. Numerisch ist das Verfahren stabil, weil jede Aktualisierung eine konvexe Kombination von Wahrscheinlichkeiten in \([0,1]\) ist.

Weiterführende Hinweise

  1. Problem: https://projecteuler.net/problem=286
  2. Poisson-Binomialverteilung: https://de.wikipedia.org/wiki/Poisson-Binomialverteilung
  3. Bisektionsverfahren: https://de.wikipedia.org/wiki/Bisektion

Problem Özeti

Toplam \(N=50\) atış vardır. \(x\). atışın isabet olasılığı

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50$$

şeklinde bilinmeyen \(q\) parametresine bağlıdır. Tam \(20\) isabet yapma olasılığı

$$0.02$$

olacak \(q\) değerini bulmak istiyoruz. Nihai Project Euler cevabı burada özellikle verilmez.

Matematiksel Yaklaşım

1) \(q\) için temel kısıt. Tüm isabet olasılıklarının \([0,1]\) aralığında kalması için

$$q>50$$

zorunludur. Beklenen isabet sayısı

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}$$

olur. Yani \(q\), \(50\)'ye çok yakın olsa bile ortalama zaten \(24.5\)'ten büyüktür. Bu nedenle “tam 20 isabet” olayı sol kuyrukta yer alır.

2) Bu dağılım binom değil, Poisson-binomial. Atışlar bağımsızdır ama her atışın olasılığı farklıdır. Bu yüzden toplam isabet sayısı klasik binom dağılımı izlemez.

Üreteç fonksiyonu bakışıyla

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr)$$

yazılır ve \(z^s\)'nin katsayısı tam \(s\) isabet olasılığıdır.

3) Tam DP reküransı. \(P_x(s)\), ilk \(x\) atıştan sonra tam \(s\) isabet olasılığı olsun. O halde

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x$$

geçerlidir. Başlangıç koşulları

$$P_0(0)=1,\qquad P_0(s>0)=0$$

şeklindedir. Aradığımız fonksiyon bu yüzden

$$F(q)=P_{50}(20)$$

olur.

4) Neden tek boyutlu dizi yeterlidir? Yeni \(P_x(s)\) değeri yalnızca bir önceki katmandaki \(P_{x-1}(s)\) ve \(P_{x-1}(s-1)\) değerlerine bağlıdır. Bu yüzden dizi yerinde güncellenebilir; tek dikkat edilmesi gereken \(s\)'yi büyükten küçüğe dolaşmaktır:

$$s=x,x-1,\dots,1.$$

5) Küçük çalışan örnek. İki atış sonunda tam bir isabet olasılığı

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2$$

olur. Yani ya ilk atış tutar ikinci kaçar, ya da ilk kaçar ikinci tutar. Genel DP formülü bunun doğrudan genellemesidir.

6) Kök arama ve bracket. Çözülen denklem

$$F(q)=0.02$$

şeklindedir. Kodun checkpoint'i şu sayıları doğrular:

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

Demek ki aranan kök kesin olarak \(52\) ile \(53\) arasındadır. \(q\) arttıkça her tekil isabet olasılığı arttığı için dağılım daha yüksek toplam skorlara kayar; ilgili aralıkta tam \(20\) isabet olasılığı aşağı iner. Bu da bisection kullanımını doğal hale getirir.

7) Bisection neden güvenlidir? Eğer \([L,H]\) aralığında

$$F(L)>0.02>F(H)$$

varsa, orta nokta \(M=(L+H)/2\) değerlendirilir. \(F(M)\) hâlâ hedefin üstündeyse kök sağ yarıdadır; değilse sol yarıdadır. Yaklaşık 220 iterasyon istenen ondalık hassasiyetin çok ötesine iner.

Karmaşıklık Analizi

Bir kez \(F(q)\) hesaplamak

$$O(NS),\qquad N=50,\ S=20$$

maliyetlidir ve bu oldukça küçüktür. \(I\) bisection adımı ile toplam zaman

$$O(INS)$$

ve bellek

$$O(S)$$

olur. Sayısal olarak da kararlıdır; çünkü her güncelleme \([0,1]\) aralığındaki olasılıkların konveks kombinasyonudur.

İleri Okuma

  1. Problem metni: https://projecteuler.net/problem=286
  2. Poisson-binomial dağılımı: https://en.wikipedia.org/wiki/Poisson_binomial_distribution
  3. Bisection yöntemi: https://tr.wikipedia.org/wiki/İkiye_bölme_yöntemi

Resumen del Problema

Hay \(N=50\) tiros. La probabilidad de acierto del tiro \(x\) es

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50.$$

Buscamos el valor de \(q\) para el que la probabilidad de terminar con exactamente \(20\) aciertos sea

$$0.02.$$

El valor numérico final de Project Euler se omite aquí a propósito.

Enfoque Matemático

1) Restricción básica sobre \(q\). Para que todas las probabilidades estén en \([0,1]\), debe cumplirse

$$q>50.$$

El número esperado de aciertos es

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}.$$

Incluso cuando \(q\) está muy cerca de \(50\), la media ya supera \(24.5\). Por tanto, el evento “exactamente 20 aciertos” está en la cola izquierda.

2) Distribución Poisson-binomial. Los tiros son independientes, pero sus probabilidades no son iguales. Por eso la distribución total no es binomial ordinaria.

La función generadora es

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr),$$

y el coeficiente de \(z^s\) es la probabilidad de obtener exactamente \(s\) aciertos.

3) Recurrencia DP exacta. Sea \(P_x(s)\) la probabilidad de tener exactamente \(s\) aciertos tras los primeros \(x\) tiros. Entonces

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x,$$

con condiciones iniciales

$$P_0(0)=1,\qquad P_0(s>0)=0.$$

La función objetivo es

$$F(q)=P_{50}(20).$$

4) Por qué basta un arreglo unidimensional. Cada nuevo estado depende solo de los valores de la capa anterior \(P_{x-1}(s)\) y \(P_{x-1}(s-1)\). Por eso puede actualizarse el mismo arreglo recorriendo \(s\) en orden descendente:

$$s=x,x-1,\dots,1.$$

5) Mini ejemplo. Tras dos tiros, la probabilidad de exactamente un acierto es

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2.$$

Es la misma recurrencia en el caso más pequeño.

6) Búsqueda de la raíz. Debemos resolver

$$F(q)=0.02.$$

El checkpoint del código verifica

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

Así, la solución está estrictamente entre \(52\) y \(53\). Cuando \(q\) aumenta, todas las probabilidades \(p_x(q)\) aumentan, la distribución se desplaza hacia más aciertos y la probabilidad de exactamente \(20\) baja en el intervalo relevante. Por eso la bisección es apropiada.

7) Por qué la bisección es fiable. Una vez tenemos \([L,H]\) con

$$F(L)>0.02>F(H),$$

se evalúa el punto medio \(M=(L+H)/2\) y se conserva la mitad correcta. Unas 220 iteraciones reducen el intervalo muchísimo más allá de la precisión decimal pedida.

Complejidad

Una evaluación de \(F(q)\) cuesta

$$O(NS),\qquad N=50,\ S=20,$$

lo cual es muy pequeño. Con \(I\) iteraciones de bisección, el tiempo total es

$$O(INS),$$

y la memoria es

$$O(S).$$

Numéricamente es estable porque cada actualización es una combinación convexa de probabilidades en \([0,1]\).

Lecturas

  1. Problema: https://projecteuler.net/problem=286
  2. Distribución Poisson-binomial: https://es.wikipedia.org/wiki/Distribución_de_Poisson_binomial
  3. Método de bisección: https://es.wikipedia.org/wiki/Método_de_bisección

问题概述

共有 \(N=50\) 次投射。第 \(x\) 次命中的概率为

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50.$$

我们要找出使“恰好命中 \(20\) 次”的概率等于

$$0.02$$

的参数 \(q\)。最终 Project Euler 数值答案这里不写出。

数学方法

1) \(q\) 的基本约束。 为了让所有命中概率都落在 \([0,1]\) 内,必须有

$$q>50.$$

总命中次数的期望为

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}.$$

因此即使 \(q\) 非常接近 \(50\),平均命中次数也已经大于 \(24.5\)。所以“恰好 20 次命中”属于左尾事件。

2) 这是 Poisson-binomial 分布。 各次投射相互独立,但成功概率彼此不同,因此总命中数不是普通二项分布。

其生成函数可写成

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr),$$

其中 \(z^s\) 的系数就是恰好 \(s\) 次命中的概率。

3) 精确 DP 递推。 设 \(P_x(s)\) 表示前 \(x\) 次后恰好命中 \(s\) 次的概率,则

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x,$$

初始条件为

$$P_0(0)=1,\qquad P_0(s>0)=0.$$

因此目标函数就是

$$F(q)=P_{50}(20).$$

4) 为什么一维数组就够了。 新的 \(P_x(s)\) 只依赖上一层的 \(P_{x-1}(s)\) 和 \(P_{x-1}(s-1)\),所以可以原地更新同一个数组,只要令 \(s\) 从大到小循环:

$$s=x,x-1,\dots,1.$$

5) 小例子。 两次投射后恰好命中一次的概率为

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2.$$

这就是一般递推在最小规模下的样子。

6) 求根与 bracket。 我们要求解

$$F(q)=0.02.$$

源码中的 checkpoint 验证了

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

因此所求 \(q\) 严格位于 \(52\) 与 \(53\) 之间。随着 \(q\) 增大,每个单独的命中概率 \(p_x(q)\) 都增大,分布整体向更高命中数移动,所以相关区间内“恰好 20 次命中”的概率会下降,适合用二分法。

7) 为什么二分法可靠。 一旦找到 \([L,H]\) 使得

$$F(L)>0.02>F(H),$$

就计算中点 \(M=(L+H)/2\),并保留包含目标值的那一半。大约 220 次迭代后,区间宽度已经远小于题目要求的十进制精度。

复杂度分析

一次计算 \(F(q)\) 的代价为

$$O(NS),\qquad N=50,\ S=20,$$

实际上非常小。若二分迭代 \(I\) 次,则总时间为

$$O(INS),$$

空间为

$$O(S).$$

数值上也很稳定,因为每一步更新都是 \([0,1]\) 中概率值的凸组合。

延伸阅读

  1. 题目页面: https://projecteuler.net/problem=286
  2. Poisson-binomial 分布: https://en.wikipedia.org/wiki/Poisson_binomial_distribution
  3. 二分法: https://zh.wikipedia.org/wiki/二分法

Краткое описание

Есть \(N=50\) бросков. Вероятность попадания на шаге \(x\) равна

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50.$$

Нужно найти параметр \(q\), при котором вероятность ровно \(20\) попаданий равна

$$0.02.$$

Итоговое числовое значение Project Euler здесь намеренно не приводится.

Математический подход

1) Базовое ограничение на \(q\). Чтобы все вероятности лежали в \([0,1]\), необходимо

$$q>50.$$

Математическое ожидание числа попаданий равно

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}.$$

Даже при \(q\), очень близком к \(50\), среднее уже больше \(24.5\). Значит, событие «ровно 20 попаданий» лежит в левом хвосте распределения.

2) Пуассон-биномиальная схема. Броски независимы, но вероятности у них разные. Поэтому общее число попаданий подчиняется не биномиальному, а пуассон-биномиальному распределению.

Порождающая функция имеет вид

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr),$$

и коэффициент при \(z^s\) равен вероятности ровно \(s\) попаданий.

3) Точная рекурсия DP. Пусть \(P_x(s)\) - вероятность иметь ровно \(s\) попаданий после первых \(x\) бросков. Тогда

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x,$$

с начальными условиями

$$P_0(0)=1,\qquad P_0(s>0)=0.$$

Следовательно, целевая функция есть

$$F(q)=P_{50}(20).$$

4) Почему хватает одномерного массива. Новый \(P_x(s)\) зависит только от старых значений \(P_{x-1}(s)\) и \(P_{x-1}(s-1)\). Поэтому можно обновлять один и тот же массив, если обходить \(s\) в обратном порядке:

$$s=x,x-1,\dots,1.$$

5) Малый пример. После двух бросков вероятность ровно одного попадания равна

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2.$$

Это и есть та же рекурсия в самом маленьком нетривиальном случае.

6) Поиск корня. Нужно решить

$$F(q)=0.02.$$

Checkpoint в коде проверяет, что

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

Значит, решение точно лежит между \(52\) и \(53\). При росте \(q\) все вероятности \(p_x(q)\) увеличиваются, распределение сдвигается к большим числам попаданий, а вероятность ровно \(20\) на нужном интервале уменьшается. Поэтому здесь естественно применять бисекцию.

7) Почему бисекция надежна. Если найден отрезок \([L,H]\), на котором

$$F(L)>0.02>F(H),$$

то вычисляется середина \(M=(L+H)/2\), и сохраняется та половина, где лежит целевое значение. Около 220 итераций делают ширину отрезка намного меньше требуемой десятичной точности.

Сложность

Одно вычисление \(F(q)\) стоит

$$O(NS),\qquad N=50,\ S=20,$$

то есть совсем немного. При \(I\) шагах бисекции итоговое время равно

$$O(INS),$$

а память

$$O(S).$$

Численно схема устойчива, потому что каждое обновление есть выпуклая комбинация вероятностей из \([0,1]\).

Дополнительные материалы

  1. Условие: https://projecteuler.net/problem=286
  2. Poisson-binomial distribution: https://en.wikipedia.org/wiki/Poisson_binomial_distribution
  3. Метод бисекции: https://ru.wikipedia.org/wiki/Метод_деления_пополам

ملخص المسألة

لدينا \(N=50\) محاولة. احتمال الإصابة في المحاولة رقم \(x\) هو

$$p_x(q)=1-\frac{x}{q},\qquad x=1,2,\dots,50.$$

نريد إيجاد القيمة \(q\) التي تجعل احتمال الحصول على \(20\) إصابة بالضبط مساويًا لـ

$$0.02.$$

القيمة العددية النهائية لمسألة Project Euler لا نعرضها هنا عمدًا.

المنهج الرياضي

1) القيد الأساسي على \(q\). لكي تبقى جميع الاحتمالات داخل المجال \([0,1]\)، لا بد أن يكون

$$q>50.$$

ومتوسط عدد الإصابات يساوي

$$\mu(q)=\sum_{x=1}^{50}\left(1-\frac{x}{q}\right)=50-\frac{1275}{q}.$$

إذن حتى عندما يكون \(q\) قريبًا جدًا من \(50\)، فإن المتوسط يتجاوز \(24.5\). لذلك فإن حدث “بالضبط 20 إصابة” يقع في الذيل الأيسر للتوزيع.

2) هذا توزيع Poisson-binomial. المحاولات مستقلة، لكن احتمالات النجاح ليست متساوية. لذلك فعدد الإصابات الكلي لا يتبع التوزيع الثنائي التقليدي.

يمكن كتابته عبر الدالة المولدة

$$G(z)=\prod_{x=1}^{50}\bigl((1-p_x)+p_x z\bigr),$$

ومعامل \(z^s\) فيها هو احتمال الحصول على \(s\) إصابات بالضبط.

3) علاقة DP الدقيقة. إذا رمزنا بـ \(P_x(s)\) لاحتمال امتلاك \(s\) إصابات بعد أول \(x\) محاولات، فإن

$$P_x(s)=P_{x-1}(s)(1-p_x)+P_{x-1}(s-1)p_x,$$

مع الشروط الابتدائية

$$P_0(0)=1,\qquad P_0(s>0)=0.$$

وعليه فإن الدالة الهدف هي

$$F(q)=P_{50}(20).$$

4) لماذا يكفي مصفوفة أحادية البعد. القيمة الجديدة \(P_x(s)\) تعتمد فقط على قيمتي الطبقة السابقة \(P_{x-1}(s)\) و\(P_{x-1}(s-1)\). لذلك يمكن تحديث مصفوفة واحدة في المكان نفسه إذا سرنا في \(s\) من الأكبر إلى الأصغر:

$$s=x,x-1,\dots,1.$$

5) مثال صغير. بعد محاولتين، يكون احتمال الحصول على إصابة واحدة بالضبط

$$P_2(1)=p_1(1-p_2)+(1-p_1)p_2.$$

وهذا هو الشكل المصغر لنفس العلاقة العامة.

6) البحث عن الجذر. نحل المعادلة

$$F(q)=0.02.$$

ويتحقق الكود من أن

$$F(52)\approx 0.0240157724>0.02,\qquad F(53)\approx 0.0180966946<0.02.$$

إذًا الجذر المطلوب يقع يقينًا بين \(52\) و\(53\). ومع ازدياد \(q\)، ترتفع جميع الاحتمالات الفردية \(p_x(q)\)، فيتحرك التوزيع نحو أعداد إصابات أكبر، وتنخفض احتمالية “بالضبط 20” على المجال المعني. لذلك تكون طريقة التنصيف مناسبة هنا.

7) لماذا التنصيف موثوق. إذا كان لدينا مجال \([L,H]\) يحقق

$$F(L)>0.02>F(H),$$

فنحسب المنتصف \(M=(L+H)/2\)، ثم نحتفظ بالنصف الذي ما زال يحتوي القيمة الهدف. تكرار هذا نحو 220 مرة يجعل عرض المجال أصغر بكثير من الدقة العشرية المطلوبة.

تحليل التعقيد

حساب واحد لـ \(F(q)\) يكلف

$$O(NS),\qquad N=50,\ S=20,$$

وهو حجم صغير جدًا. ومع \(I\) خطوات من التنصيف يصبح الزمن الكلي

$$O(INS),$$

والذاكرة

$$O(S).$$

ومن ناحية عددية، التحديث مستقر لأن كل قيمة جديدة هي تركيب محدب من احتمالات تقع داخل \([0,1]\).

مراجع إضافية

  1. صفحة المسألة: https://projecteuler.net/problem=286
  2. توزيع Poisson-binomial: https://en.wikipedia.org/wiki/Poisson_binomial_distribution
  3. طريقة التنصيف: https://ar.wikipedia.org/wiki/طريقة_التنصيف