首页 > 其他分享 >概率生成函数

概率生成函数

时间:2023-05-31 16:33:11浏览次数:33  
标签:infty 概率 函数 sum 生成 随机 border 个字符

概率生成函数

认识概率生成函数,形如

\[f(x) = \sum_{i = 0}^{+\infty}P(X = i)x^i \]

也就是 i 次项的系数是随机变量 X 等于 i 的概率。

这个东西有两个用处:

1 关于概率

\(f(1) = 1\) 其实就是把 \(f(x)\) 的所有系数加起来,而这里的系数就是概率

2 关于期望

想一想,上面的式子想出现期望,是不是需要在 \(P(X=i)\) 上乘一个 i 呀?如何让这个 i 出现呢?求导啊!

\[f'(x) = \sum_{i = 0}^{+\infty}iP(X = i)x^{i - 1} ~~~\Rightarrow~~~f'(1) = \sum_{i = 0}^{+\infty}iP(X = i) \]

综上所述

\[f(1) = 1~~~~f'(1)=E(X) \]

先设一个变量 \(Y\) 表示(任意一次随机的过程中)停止的时候 \(T\) 的长度,也就是随机了 \(Y\) 个字符的时候恰好随机出 \(S\)。

引入两个概率生成函数 \(f(x)\) 和 \(g(x)\) ,分别表示 \(Y=i\) 的概率和 \(Y>i\) 的概率。也就是

\[f(x) = \sum_{i = 0}^{+\infty}P(Y = i)~~~~~g(x) = \sum_{i = 0}^{+\infty}P(Y > i) \]

\(f_i\) 表示 \(f(x)\) 的 \(x^i\) 次方系数,也就是 \(Y = i\) 的概率, \(g_i\) 同理。

接下来就可以建立一些递推式子:

\[g_i = f_{i + 1}+g_{i + 1} (i \geq 1) \]

生成函数中则为( \(+1\) 是因为处理边界情况):

\[xg(x) + 1 = f(x) + g(x) ~~~\Rightarrow~~~f(x) = (x-1)g(x) + 1 \]

再求导(函数乘积求导公式\([g(x)f(x)]' = g(x)'f(x) + f(x)'g(x)\)):

\[f'(x) = (x - 1)g'(x) + g(x) \]

过程2

我们设一个新的数列 \(h_i(i \geq 0)\) 表示同时满足下列两个条件 (记为事件A) 的概率:

1.随机了 \(i\) 个字符但没出现 \(S\)

2.接着无条件随机 \(m\) 个字符( \(m\) 是 \(S\) 长度) ,且 \(m\) 个字符刚好为 \(S\)

什么叫“无条件”呢?就是随机这 \(m\) 个字符的过程中,有可能还没随机够 \(m\) 个,就已经出现 \(S\) 了。这种情况下我们强迫它一定要随机够 \(m\) 个。

相当于,\(h_i\)​ 表示的是这一个事件 \(A\) 的发生概率:

如何计算 \(h_i\)?

第一种方法

两事件相互独立,概率乘起来,即有:

\(h_i = g_in^{-m}\)

第二种方法

如果事件 \(A\) 发生,则一定满足 \(i< Y \leq i + m\) ,我们讨论 \(Y\) 每一个取值

假设\(Y = y\) ,这个前提的概率是 \(f_i\) ,我们求出在这个前提下事件 \(A\) 发生的概率乘起来并且将\(Y = y ~~~~~~ y \in (i,i+m]\) 的所有概率加起来就是事件 \(A\) 发生的概率 \(h_i\)

设 \(t = y - i\) 也就是代表无条件随机 \(t\) 个字符就出现 \(S\)

重点

那么字符串 \(S_0 - S_t\) 一定为一个前缀(因为从 \(0-t\) )

那么字符串 \(S_0 - S_t\) 一定为一个后缀(因为我们从 \(t\) 结束的 )

也就是 \(S\) 的 \(border\)

概率也就好求了

条件 \(b\) 是概率性的,剩下来的字符和前面的是独立的,因此这 \(m−t\) 个字符满足要求的概率就是 \(n^{−(m−t)}=n^{t−m}\)。

因此在 \(Y = y,t=y-i\) 条件下,事件 \(A\) 的概率是 \([S_0 - S_t是一个border]n^{t-m}\)

根据全概率公式,把所有可能情况的概率加起来,事件 A 发生的概率 \(h_i\) 就是

\[\sum_{t=1} ^ {m}f_yn^{t - m}[S_0 - S_t是一个border] , t = y - i~~\Rightarrow~~ h_i = \sum_{t=S的border长} f_{i+t}n^{t - m} \]

综上,根据两种方法求出的 \(h_i\) 联立

\[g_in^{-m} = \sum_{t=S的border长} f_{i+t}n^{t - m}\\ \Rightarrow g_i = \sum_{t=S的border长} f_{i+t}n^{t} \]

把 \(g(x)\) 乘以 \(x^m\),第 \(i+m\) 项的系数变成了 \(g^i\)​。

把 \(f(x)\) 乘以 \(x^{m−t}\),第 \(i+m\) 项的系数变成了 \(f_{(i+m)−(m−t)}​=f_{i+t}\)​

所以

\[x^{m} * g(x) = \sum_{t=S的border长} x^{m - t}f(x)n^{t} \]

我们要求期望,也就是 \(g(1)\)

\[g(1) = \sum_{t=S的border长} f(1)n^{t} \]

翻到前面可以看到 \(f(1)\) 是总概率是 \(1\)

得到:

\[g(1) = \sum_{t=S的border长} n^{t} \]

\(border\) 用 kmp 求一下就可以啦(本题 \(S\) 本身也是 \(S\) 的border)

标签:infty,概率,函数,sum,生成,随机,border,个字符
From: https://www.cnblogs.com/hfjh/p/17446556.html

相关文章

  • UE4中的蓝图函数库
    #蓝图函数库此文为AssertionsBlueprintFunctionLibraries(opensnewwindow)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解我们在开发中经常发现需要一系列工具函数来让开发更简单。这些函数经常是无状态的,并且在各种gameplay框架代码中......
  • 编译器绕过拷贝构造函数和返回值优化
    写在前面:在拷贝初始化(也就是用等号初始化,注意使用拷贝构造函数创建一个新的对象不属于拷贝初始化)过程中,编译器可以(但不是必须)跳过拷贝构造函数或者移动构造函数,直接创建对象。1stringnull_book="999";2//可以改写为3stringnull_book("999");这里面”999“隐式的转换为......
  • Mybatis-plus关于代码生成器的使用
    1、添加依赖 2、在test包下创建一个CodeGet类,实现生成代码的功能。注意:全局配置、数据源配置一定要和自己的电脑配置一致! 3、执行CodeGet类中的main方法。打印台有如下图提示字样,即自动生成成功。 4、对比两张图。在wechat文件夹下有controller、entity、mapper、s......
  • 实现memcpy()函数过程总结
    1.按字节实现1)初步版本void*my_memcpy(void*dst,constvoid*src,intn){if(dst==NULL&&src==NULL&&n<=0)returnNULL;char*s=(char*)src;char*d=(char*)dst;while(n--){*d++=*s++;}returnd......
  • 欧拉函数与容斥
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:给定五个数,其中有和,求满足条件的有序对的个数。题目中    明确说在所有的输入中。分析:问题可以转化为和时,的有序对的个数。那么先比较和的    大小,相同的部分可以用欧拉函数的累加计算,没有公共的部分用容斥计算......
  • vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)
    使用qrcodejs2生成二维码的方法:/***二维码生成*@paramcontent生成二维码内容*@paramdesc二维码底部描述*@paramqrcodeDom挂在dom*@returns{*|HTMLDivElement}*/exportfunctiongeneratorQrcode(content,desc,qrcodeDom=null){constqrcodeCo......
  • 关于C++字符串的一些函数
    其实印象里,c的char用法反倒比c++的string深一点,可能是因为我对string的运用太少了吧。 提到C++的string,就得先提一下首先提一下C的char类型,毕竟C++是根据C延展过来的,继承了C的特性,而且C本身是没有string这个东西的。 char是什么?一个关键字,用于声明一个变量是字符类型。好吧,......
  • Python 函数
    函数返回多个返回值defmultiple_return_value():importdatetimed=datetime.date.today()val_1='年份为:{}'.format(d.year)val_2='月份为:{}'.format(d.month)returnval_1,val_2#只需在return关键字后跟多个值(依次用逗号分隔)val=mult......
  • python 中 re.match和re.search()函数
     两者都返回首次匹配字符串的索引,re.match函数只从头开始匹配,re.search函数不限制只从头开始匹配。001、re.match函数[root@PC1test2]#python3Python3.10.9(main,Mar12023,18:23:06)[GCC11.2.0]onlinuxType"help","copyright","credits"or"license"......
  • C/C++杂记:虚函数的实现的基本原理
    1.概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例:其中:B的虚函数表中存放着B::foo和B::bar两个函数指针。D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基......