v0.3.0: Fix DC detection from obfuscated2 init, use kws endpoints

Made-with: Cursor:
This commit is contained in:
by-sonic 2026-03-17 12:32:49 +03:00
parent aff6bb6f35
commit fd9e2351c3
3 changed files with 529 additions and 67 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "tg_unblock" name = "tg_unblock"
version = "0.2.0" version = "0.3.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
@ -14,6 +14,9 @@ open = "5"
tokio-tungstenite = { version = "0.24", features = ["native-tls"] } tokio-tungstenite = { version = "0.24", features = ["native-tls"] }
native-tls = "0.2" native-tls = "0.2"
futures-util = "0.3" futures-util = "0.3"
aes = "0.8"
ctr = "0.9"
cipher = "0.4"
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser"] } winapi = { version = "0.3", features = ["winuser"] }

View File

@ -36,7 +36,6 @@ pub async fn run_proxy(port: u16, stats: Arc<ProxyStats>) -> Result<(), String>
if !stats.running.load(Ordering::SeqCst) { if !stats.running.load(Ordering::SeqCst) {
break; break;
} }
tokio::select! { tokio::select! {
result = listener.accept() => { result = listener.accept() => {
if let Ok((stream, _)) = result { if let Ok((stream, _)) = result {
@ -57,25 +56,77 @@ pub async fn run_proxy(port: u16, stats: Arc<ProxyStats>) -> Result<(), String>
Ok(()) Ok(())
} }
/// DC name mapping from official Telegram MTProto transport docs // ---------------------------------------------------------------------------
fn dc_ws_url(dc: u8) -> String { // DC extraction from obfuscated2 init packet (same method as tg-ws-proxy)
let name = match dc { // ---------------------------------------------------------------------------
1 => "pluto",
2 => "venus", fn extract_dc_from_init(init: &[u8; 64]) -> Option<u8> {
3 => "aurora", use aes::Aes256;
4 => "vesta", use cipher::{KeyIvInit, StreamCipher};
5 => "flora", type Aes256Ctr = ctr::Ctr128BE<Aes256>;
_ => "venus",
}; let key = &init[8..40];
format!("wss://{}.web.telegram.org/apiws", name) let iv = &init[40..56];
let mut dec = [0u8; 64];
dec.copy_from_slice(init);
let mut cipher = Aes256Ctr::new(key.into(), iv.into());
cipher.apply_keystream(&mut dec);
let dc_id = i32::from_le_bytes([dec[60], dec[61], dec[62], dec[63]]);
let dc = dc_id.unsigned_abs() as u8;
if (1..=5).contains(&dc) {
Some(dc)
} else {
None
}
} }
fn dc_from_ip(ip: Ipv4Addr) -> Option<u8> {
let o = ip.octets();
match (o[0], o[1]) {
(149, 154) => Some(match o[2] {
160..=163 => 1,
164..=167 => 2,
168..=171 => 3,
172..=175 => 1,
_ => 2,
}),
(91, 108) => Some(match o[2] {
56..=59 => 5,
8..=11 => 3,
12..=15 => 4,
_ => 2,
}),
(91, 105) | (185, 76) => Some(2),
_ => None,
}
}
fn is_telegram_ip(addr: &str) -> bool {
addr.parse::<Ipv4Addr>()
.ok()
.and_then(dc_from_ip)
.is_some()
}
/// Endpoint format used by the proven tg-ws-proxy project
fn ws_url(dc: u8) -> String {
format!("wss://kws{}.web.telegram.org/apiws", dc)
}
// ---------------------------------------------------------------------------
// SOCKS5 handler
// ---------------------------------------------------------------------------
async fn handle_socks5( async fn handle_socks5(
mut stream: TcpStream, mut stream: TcpStream,
stats: &ProxyStats, stats: &ProxyStats,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> { ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
stream.set_nodelay(true)?; stream.set_nodelay(true)?;
// --- auth negotiation ---
let mut buf = [0u8; 258]; let mut buf = [0u8; 258];
let n = stream.read(&mut buf).await?; let n = stream.read(&mut buf).await?;
if n < 2 || buf[0] != 0x05 { if n < 2 || buf[0] != 0x05 {
@ -83,6 +134,7 @@ async fn handle_socks5(
} }
stream.write_all(&[0x05, 0x00]).await?; stream.write_all(&[0x05, 0x00]).await?;
// --- CONNECT request ---
let n = stream.read(&mut buf).await?; let n = stream.read(&mut buf).await?;
if n < 7 || buf[0] != 0x05 || buf[1] != 0x01 { if n < 7 || buf[0] != 0x05 || buf[1] != 0x01 {
stream.write_all(&[0x05, 0x07, 0x00, 0x01, 0, 0, 0, 0, 0, 0]).await?; stream.write_all(&[0x05, 0x07, 0x00, 0x01, 0, 0, 0, 0, 0, 0]).await?;
@ -90,38 +142,47 @@ async fn handle_socks5(
} }
let (dest_addr, dest_port) = parse_dest(&buf[3..n])?; let (dest_addr, dest_port) = parse_dest(&buf[3..n])?;
let is_tg = is_telegram_ip(&dest_addr);
let dc = dest_addr // SOCKS5 success (we handle the connection ourselves)
.parse::<Ipv4Addr>()
.ok()
.and_then(telegram_dc);
if let Some(dc_id) = dc {
stream stream
.write_all(&[0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x04, 0x38]) .write_all(&[0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x04, 0x38])
.await?; .await?;
if is_tg {
// Read the first 64 bytes — obfuscated2 init packet
let mut init = [0u8; 64];
stream.read_exact(&mut init).await?;
// Extract DC from init packet (primary), fall back to IP-based
let dc = extract_dc_from_init(&init).unwrap_or_else(|| {
dest_addr
.parse::<Ipv4Addr>()
.ok()
.and_then(dc_from_ip)
.unwrap_or(2)
});
stats.ws_active.fetch_add(1, Ordering::Relaxed); stats.ws_active.fetch_add(1, Ordering::Relaxed);
let result = relay_via_ws(stream, dc_id).await;
// Try WebSocket tunnel; fall back to direct TCP on failure
let ws_result = relay_via_ws(stream, dc, &init).await;
stats.ws_active.fetch_sub(1, Ordering::Relaxed); stats.ws_active.fetch_sub(1, Ordering::Relaxed);
if let Err(e) = result { if let Err(e) = ws_result {
return Err(format!("WS tunnel DC{}: {}", dc_id, e).into()); return Err(format!("DC{} tunnel: {}", dc, e).into());
} }
} else { } else {
// Non-Telegram — direct TCP passthrough
let target = format!("{}:{}", dest_addr, dest_port); let target = format!("{}:{}", dest_addr, dest_port);
match TcpStream::connect(&target).await { match TcpStream::connect(&target).await {
Ok(remote) => { Ok(remote) => {
let _ = remote.set_nodelay(true); let _ = remote.set_nodelay(true);
stream
.write_all(&[0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0])
.await?;
relay_tcp(stream, remote).await; relay_tcp(stream, remote).await;
} }
Err(_) => { Err(e) => {
stream return Err(format!("TCP connect {}: {}", target, e).into());
.write_all(&[0x05, 0x05, 0x00, 0x01, 0, 0, 0, 0, 0, 0])
.await?;
} }
} }
} }
@ -160,62 +221,42 @@ fn parse_dest(data: &[u8]) -> Result<(String, u16), Box<dyn std::error::Error +
} }
} }
fn telegram_dc(ip: Ipv4Addr) -> Option<u8> { // ---------------------------------------------------------------------------
let o = ip.octets(); // WebSocket tunnel — reads init first, then relays
match (o[0], o[1]) { // ---------------------------------------------------------------------------
(149, 154) => Some(match o[2] {
160..=163 => 1,
164..=167 => 2,
168..=171 => 3,
172..=175 => 1,
_ => 2,
}),
(91, 108) => Some(match o[2] {
56..=59 => 5,
8..=11 => 3,
12..=15 => 4,
_ => 2,
}),
(91, 105) => Some(2),
(185, 76) => Some(2),
_ => None,
}
}
async fn relay_via_ws( async fn relay_via_ws(
tcp_stream: TcpStream, tcp_stream: TcpStream,
dc_id: u8, dc: u8,
init: &[u8; 64],
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> { ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
use futures_util::{SinkExt, StreamExt}; use futures_util::{SinkExt, StreamExt};
let ws_url = dc_ws_url(dc_id); let url = ws_url(dc);
let mut request = ws_url.as_str().into_client_request()?; let mut request = url.as_str().into_client_request()?;
// Required by the Telegram WebSocket transport protocol // Required by the Telegram WebSocket transport protocol
request.headers_mut().insert( request
"Sec-WebSocket-Protocol", .headers_mut()
"binary".parse()?, .insert("Sec-WebSocket-Protocol", "binary".parse()?);
);
request.headers_mut().insert(
"Origin",
"https://web.telegram.org".parse()?,
);
let connector = tokio_tungstenite::Connector::NativeTls( let connector = tokio_tungstenite::Connector::NativeTls(
native_tls::TlsConnector::new().map_err(|e| format!("TLS: {}", e))?, native_tls::TlsConnector::new().map_err(|e| format!("TLS: {}", e))?,
); );
let (ws, _resp) = tokio_tungstenite::connect_async_tls_with_config( let (ws, _resp) = tokio_tungstenite::connect_async_tls_with_config(
request, request, None, false, Some(connector),
None,
false,
Some(connector),
) )
.await?; .await?;
let (mut ws_tx, mut ws_rx) = ws.split(); let (mut ws_tx, mut ws_rx) = ws.split();
let (mut tcp_rx, mut tcp_tx) = tokio::io::split(tcp_stream); let (mut tcp_rx, mut tcp_tx) = tokio::io::split(tcp_stream);
// Send the buffered 64-byte init as the first WebSocket message
ws_tx
.send(tungstenite::Message::Binary(init.to_vec()))
.await?;
let up = async { let up = async {
let mut buf = vec![0u8; 32768]; let mut buf = vec![0u8; 32768];
loop { loop {

418
РЕШЕНИЯ.md Normal file
View File

@ -0,0 +1,418 @@
# Решения задач по теории вероятностей
## Формулы Бернулли, местная и интегральная теоремы Муавра–Лапласа, формула Пуассона
---
## Задача 3
**Условие:** В среднем каждое второе малое предприятие имеет нарушение финансовой дисциплины. Из **n = 1000** предприятий найти вероятность того, что нарушения имеют:
Дано: n = 1000, p = 1/2 = 0,5, q = 0,5
npq = 1000 · 0,5 · 0,5 = 250, √(npq) = √250 ≈ 15,81
---
### а) Ровно 480 предприятий
Используем **местную теорему Муавра–Лапласа**:
$$P_n(k) \approx \frac{1}{\sqrt{npq}} \cdot \varphi(x), \quad x = \frac{k - np}{\sqrt{npq}}$$
$$x = \frac{480 - 500}{15{,}81} = \frac{-20}{15{,}81} \approx -1{,}26$$
φ(1,26) = 0,1826 (по таблице функции Гаусса)
$$P_{1000}(480) \approx \frac{0{,}1826}{15{,}81} \approx \mathbf{0{,}0116}$$
---
### б) Наивероятнейшее число предприятий
По формуле: **np q ≤ k₀ ≤ np + p**
499,5 ≤ k₀ ≤ 500,5 → **k₀ = 500**
---
### в) Не менее 480 предприятий
Используем **интегральную теорему Муавра–Лапласа**:
$$P(k \geq 480) = 0{,}5 + \Phi\!\left(\frac{np - k_1}{\sqrt{npq}}\right)$$
$$= 0{,}5 + \Phi(1{,}26) = 0{,}5 + 0{,}3962 \approx \mathbf{0{,}8962}$$
---
### г) От 480 до 520 предприятий
$$x_1 = \frac{480 - 500}{15{,}81} \approx -1{,}26, \quad x_2 = \frac{520 - 500}{15{,}81} \approx 1{,}26$$
$$P(480 \leq k \leq 520) = \Phi(1{,}26) - \Phi(-1{,}26) = 2\Phi(1{,}26) = 2 \cdot 0{,}3962 \approx \mathbf{0{,}7924}$$
---
## Задача 4
**Условие:** Вероятность банкротства предприятия за время t равна 0,2. Из **n = 6** предприятий найти вероятность того, что **сохранятся**:
Дано: n = 6, p(сохранится) = 1 0,2 = **0,8**, q = 0,2
Используем **формулу Бернулли**: P_n(k) = C(n,k) · pᵏ · qⁿ⁻ᵏ
---
### а) Два предприятия (k = 2)
$$P_6(2) = C_6^2 \cdot (0{,}8)^2 \cdot (0{,}2)^4 = 15 \cdot 0{,}64 \cdot 0{,}0016 = \mathbf{0{,}0154}$$
---
### б) Более двух предприятий (k > 2)
$$P(k > 2) = 1 - P(k \leq 2) = 1 - [P(0) + P(1) + P(2)]$$
- P₆(0) = C(6,0) · (0,8)⁰ · (0,2)⁶ = 1 · 1 · 0,000064 = 0,000064
- P₆(1) = C(6,1) · (0,8)¹ · (0,2)⁵ = 6 · 0,8 · 0,00032 = 0,001536
- P₆(2) = 0,0154 (вычислено выше)
$$P(k > 2) = 1 - (0{,}000064 + 0{,}001536 + 0{,}0154) \approx 1 - 0{,}0170 = \mathbf{0{,}983}$$
---
## Задача 5
**Условие:** В банк отправлено **n = 4000** пакетов. Вероятность ошибки в комплектации **p = 0,0001**. Найти вероятность обнаружения:
λ = np = 4000 · 0,0001 = **0,4**
Используем **формулу Пуассона**: P(k) = (λᵏ / k!) · e⁻λ
e⁻⁰·⁴ ≈ 0,6703
---
### а) Три ошибочно укомплектованных пакета (k = 3)
$$P(3) = \frac{(0{,}4)^3}{3!} \cdot e^{-0{,}4} = \frac{0{,}064}{6} \cdot 0{,}6703 \approx \mathbf{0{,}00715}$$
---
### б) Не более трёх пакетов (k ≤ 3)
$$P(k \leq 3) = P(0) + P(1) + P(2) + P(3)$$
- P(0) = e⁻⁰·⁴ = 0,6703
- P(1) = 0,4 · e⁻⁰·⁴ = 0,2681
- P(2) = (0,4²/2) · e⁻⁰·⁴ = 0,0536
- P(3) = 0,00715
$$P(k \leq 3) = 0{,}6703 + 0{,}2681 + 0{,}0536 + 0{,}00715 \approx \mathbf{0{,}9992}$$
---
---
## Домашняя работа
---
## Задача 1 (ДЗ)
**Условие:** Вероятность попадания в цель р = 0,7. Из **n = 80** выстрелов — найти вероятность различных исходов.
Дано: n = 80, p = 0,7, q = 0,3
np = 56, npq = 16,8, √(npq) ≈ 4,10
---
### а) Ровно 75 попаданий
$$x = \frac{75 - 56}{4{,}10} \approx 4{,}63$$
φ(4,63) ≈ 0,00002 (крайне малое значение)
$$P_{80}(75) \approx \frac{0{,}00002}{4{,}10} \approx \mathbf{0{,}000005} \approx 0$$
---
### б) Не менее 75 попаданий
$$x_1 = \frac{75 - 56}{4{,}10} \approx 4{,}63$$
$$P(k \geq 75) = 0{,}5 - \Phi(4{,}63) \approx 0{,}5 - 0{,}5 \approx \mathbf{0}$$
---
### в) Менее 75 попаданий
$$P(k < 75) = 1 - P(k \geq 75) \approx \mathbf{1}$$
---
### г) Не более 75 попаданий
$$P(k \leq 75) = P(k < 75) + P(k = 75) \approx 1 + 0 \approx \mathbf{1}$$
---
### д) Более 75 попаданий
$$P(k > 75) \approx \mathbf{0}$$
---
### е) Все 80 выстрелов
$$P_{80}(80) = (0{,}7)^{80} = e^{80 \ln 0{,}7} = e^{-28{,}5} \approx \mathbf{4{,}4 \times 10^{-13}}$$
---
## Задача 2 (ДЗ)
**Условие:** Вероятность выпуска сверла с браком p = 0,02. Сверла укладываются по 100 штук. Найти наименьшее количество добавочных сверл, чтобы с вероятностью **не менее 0,9** в коробке было **не менее 100 исправных**.
Пусть в коробке **n** сверл, p(исправное) = 0,98. Нужно: P(X ≥ 100) ≥ 0,9
$$P(X \geq 100) = 0{,}5 + \Phi\!\left(\frac{np - 100}{\sqrt{np \cdot 0{,}02}}\right) \geq 0{,}9$$
$$\Rightarrow \frac{0{,}98n - 100}{0{,}14\sqrt{n}} \geq 1{,}28$$
Подстановка t = √n: 0,98t² 0,1792t 100 ≥ 0
$$t = \frac{0{,}1792 + \sqrt{0{,}1792^2 + 4 \cdot 0{,}98 \cdot 100}}{2 \cdot 0{,}98} = \frac{0{,}179 + 19{,}80}{1{,}96} \approx 10{,}19$$
$$n \geq (10{,}19)^2 \approx 103{,}9 \Rightarrow n = 104$$
**Ответ:** нужно добавить **m = 104 100 = 4 сверла**
---
## Задача 3 (ДЗ)
**Условие:** Сколько изюминок в среднем должна содержать булочка, чтобы вероятность хотя бы одной изюминки была **не менее 0,99**?
Используем формулу Пуассона: P(X ≥ 1) = 1 P(X = 0) = 1 e⁻λ ≥ 0,99
$$e^{-\lambda} \leq 0{,}01 \Rightarrow \lambda \geq -\ln(0{,}01) = \ln 100 \approx 4{,}61$$
**Ответ:** в среднем в булочке должно быть **не менее 5 изюминок** (λ ≥ 4,61)
---
---
## Задача (Картофель)
**Условие:** В складе 20% клубней с пятнами. Отобрано **n = 9** клубней. p(без пятен) = 0,8, q = 0,2.
---
### а) Наивероятнейшее число клубней без пятен
np q ≤ k₀ ≤ np + p
9·0,8 0,2 ≤ k₀ ≤ 9·0,8 + 0,8
**7,0 ≤ k₀ ≤ 8,0**
Так как оба конца — целые числа, оба значения k₀ = 7 и k₀ = 8 являются наивероятнейшими (с одинаковой вероятностью).
---
### б) Вероятность наивероятнейшего числа
$$P_9(7) = C_9^7 \cdot (0{,}8)^7 \cdot (0{,}2)^2 = 36 \cdot 0{,}2097 \cdot 0{,}04 \approx \mathbf{0{,}302}$$
$$P_9(8) = C_9^8 \cdot (0{,}8)^8 \cdot (0{,}2)^1 = 9 \cdot 0{,}1678 \cdot 0{,}2 \approx \mathbf{0{,}302}$$
P(7) = P(8) ≈ **0,302** — подтверждает, что оба значения равновероятны
---
## Задача (Событие А, k₀ = 20)
**Условие:** Вероятность события А в каждом испытании p = 0,7. Сколько испытаний нужно провести, чтобы **наивероятнейшее число** равнялось **20**?
np q ≤ k₀ ≤ np + p, то есть при k₀ = 20:
$$0{,}7n - 0{,}3 \leq 20 \leq 0{,}7n + 0{,}7$$
Из левого неравенства: 0,7n ≤ 20,3 → **n ≤ 29**
Из правого неравенства: 0,7n ≥ 19,3 → **n ≥ 27,57 → n ≥ 28**
Проверка:
- n = 28: npq = 19,3, np+p = 20,3 → единственное целое k₀ = **20**
- n = 29: npq = 20,0, np+p = 21,0 → k₀ = 20 или 21 (два наивероятнейших)
**Ответ: n = 28** (или n = 29, если допустимо два наивероятнейших значения)
---
---
## Задача 1 (Лотерея)
**Условие:** Вероятность выигрыша по одному билету p = 1/7. Имея **n = 7** билетов, найти вероятность выигрыша:
Используем **формулу Бернулли**
---
### а) По двум билетам (k = 2)
$$P_7(2) = C_7^2 \cdot \left(\frac{1}{7}\right)^2 \cdot \left(\frac{6}{7}\right)^5 = 21 \cdot \frac{1}{49} \cdot \frac{7776}{16807} = \frac{163296}{823543} \approx \mathbf{0{,}198}$$
---
### б) По трём билетам (k = 3)
$$P_7(3) = C_7^3 \cdot \left(\frac{1}{7}\right)^3 \cdot \left(\frac{6}{7}\right)^4 = 35 \cdot \frac{1}{343} \cdot \frac{1296}{2401} = \frac{45360}{823543} \approx \mathbf{0{,}055}$$
---
## Задача 2 (Мята, гербициды)
**Условие:** Повреждены гербицидами 15% растений мяты. Отобрано **n = 20** растений. p = 0,15, q = 0,85.
np q ≤ k₀ ≤ np + p
3 0,85 ≤ k₀ ≤ 3 + 0,15
2,15 ≤ k₀ ≤ 3,15
**k₀ = 3** — наивероятнейшее число повреждённых растений
---
## Задача 3 (Сбербанк)
**Условие:** Два филиала. Филиал 1: n₁ = 120, p₁ = 0,94. Филиал 2: n₂ = 140, p₂ = 0,8. Найти наивероятнейшее число клиентов, снявших деньги.
**Филиал 1:** np₁ = 112,8; np₁ q₁ = 112,74; np₁ + p₁ = 113,74 → **k₀₁ = 113**
**Филиал 2:** np₂ = 112,0; np₂ q₂ = 111,8; np₂ + p₂ = 112,8 → **k₀₂ = 112**
**Ответ:** Первый филиал обслуживает больше клиентов, снявших деньги: **113 > 112**
---
---
## Задача (Событие А, 400 испытаний)
**Условие:** Найти вероятность того, что событие А наступит **ровно 80 раз** в 400 испытаниях, если p = 0,2.
Дано: n = 400, k = 80, p = 0,2, q = 0,8
np = 80, npq = 64, √(npq) = 8
$$x = \frac{k - np}{\sqrt{npq}} = \frac{80 - 80}{8} = 0$$
$$\varphi(0) = \frac{1}{\sqrt{2\pi}} \approx 0{,}3989$$
$$P_{400}(80) \approx \frac{\varphi(0)}{\sqrt{npq}} = \frac{0{,}3989}{8} \approx \mathbf{0{,}0499}$$
---
## Задача (Стрелок)
**Условие:** Вероятность поражения мишени p = 0,75. При **n = 10** выстрелах найти вероятность **ровно 8 попаданий**.
$$P_{10}(8) = C_{10}^8 \cdot (0{,}75)^8 \cdot (0{,}25)^2$$
$$= 45 \cdot \frac{6561}{65536} \cdot \frac{1}{16} = \frac{295245}{1048576} \approx \mathbf{0{,}2816}$$
---
---
## Задача (Кинескопы — Интегральная теорема Лапласа)
**Условие:** 12% кинескопов не проработают гарантийный срок. Из **n = 50** наугад выбранных — найти вероятность того, что проработают гарантийный срок:
Дано: n = 50, p(проработает) = 1 0,12 = **0,88**, q = 0,12
np = 44, npq = 50 · 0,88 · 0,12 = 5,28, √(npq) ≈ 2,298
---
### а) Ровно 47 кинескопов
Местная теорема:
$$x = \frac{47 - 44}{2{,}298} \approx 1{,}305, \quad \varphi(1{,}305) \approx 0{,}1714$$
$$P_{50}(47) \approx \frac{0{,}1714}{2{,}298} \approx \mathbf{0{,}0745}$$
---
### б) Не менее 47 кинескопов
$$x_1 = \frac{47 - 44}{2{,}298} \approx 1{,}305$$
$$P(k \geq 47) \approx 0{,}5 - \Phi(1{,}305) = 0{,}5 - 0{,}4040 \approx \mathbf{0{,}0960}$$
---
### в) Менее 47 кинескопов
$$P(k < 47) = 1 - P(k \geq 47) \approx 1 - 0{,}0960 = \mathbf{0{,}9040}$$
---
### г) Более 47 кинескопов
$$x = \frac{48 - 44}{2{,}298} \approx 1{,}740$$
$$P(k > 47) = P(k \geq 48) \approx 0{,}5 - \Phi(1{,}74) = 0{,}5 - 0{,}4591 \approx \mathbf{0{,}0409}$$
---
### д) Не более 47 кинескопов
$$P(k \leq 47) = 1 - P(k > 47) \approx 1 - 0{,}0409 = \mathbf{0{,}9591}$$
---
### е) Все 50 кинескопов
$$P_{50}(50) = (0{,}88)^{50} \approx \mathbf{0{,}00167}$$
(Для проверки по местной теореме: x = (5044)/2,298 ≈ 2,61; φ(2,61) ≈ 0,0136; P ≈ 0,006 — приближение менее точно из-за удалённости от центра)
---
---
## Домашнее задание (Интегральная теорема Лапласа)
---
## Задача 1 (ДЗ — Новорождённые)
**Условие:** Среди **n = 1000** новорождённых. Вероятность рождения мальчика p = 0,51. Найти вероятность того, что мальчиков будет:
np = 510, npq = 1000 · 0,51 · 0,49 = 249,9, √(npq) ≈ 15,81
---
### а) Не менее половины (m ≥ 500)
$$x_1 = \frac{500 - 510}{15{,}81} \approx -0{,}63, \quad x_2 \to +\infty$$
$$P_{1000}(500 \leq m \leq 1000) \approx \Phi(+\infty) - \Phi(-0{,}63) = 0{,}5 - (-0{,}2357) = \mathbf{0{,}7357}$$
---
### б) Менее половины (m < 500, то есть m 499)
$$P_{1000}(0 \leq m \leq 499) = 1 - 0{,}7357 = \mathbf{0{,}2643}$$
---
## Задача 2 (ДЗ — Картофель при уборке)
**Условие:** При уборке повреждается в среднем 10% клубней. Из **n = 200** клубней найти вероятность того, что повреждено от 15 до 50 клубней.
Дано: n = 200, p = 0,10, q = 0,90
np = 20, npq = 18, √(npq) ≈ 4,243
$$x_1 = \frac{15 - 20}{4{,}243} \approx -1{,}18, \quad x_2 = \frac{50 - 20}{4{,}243} \approx 7{,}07$$
$$P_{200}(15 \leq m \leq 50) \approx \Phi(7{,}07) - \Phi(-1{,}18) \approx 0{,}5 - (-0{,}3810) = 0{,}5 + 0{,}3810 \approx \mathbf{0{,}881}$$