如果一个比特串不是一个较小比特串的多个副本的重复,则称其为基元。例如,101101不是原语,因为它可以分解为字符串101的两个副本。在Python表示法中,可以通过"101"*2
另一方面,字符串11001101是基本的。(它包含非原始的子字符串,但字符串作为一个整体不能分解为单个字符串的多个副本。)
对于给定的n个,让我们计算长度有多少个基本位字符串n个。打电话给这个(f)(n个). 有2个n个长度的位串n个、和(f)(n个)这些是原始的。例如,有(f)(12) 长度为12的基本位字符串。非原语字符串由原语字符串的副本组成:两个长度为6的原语字符串副本,三个长度为4的原语串副本,等等。这表示
一般来说
这里的和是所有正整数的和d日那道鸿沟n个.
不幸的是,这个公式是落后的。它给出了一个众所周知的公式,2n个,作为我们试图计算的所有事情的总和。这个莫比乌斯反演公式这正是我们需要改变这个公式的地方,这样新事物就在左边,旧事物的总和就在右边。它告诉我们
其中μ是Möbius函数。
我们可以计算(f)(n个)使用Python,如下所示:
来自sympy.theory import mobius,除数定义num_primitive(n):返回和(mobius(n/d)*2**d用于除数(n)中的d)
SymPy的最新版本0.7.6带有一个函数莫比乌斯
用于计算Möbius函数。如果您使用的是SymPy的早期版本,您可以使用自己的莫比乌斯
功能:
来自sympy.theory进口保理商定义mobius(n):指数=因子(n).values()lenexp=len(指数)m=0,如果lenexp==0 else max(指数)如果m>1,则返回0,否则返回(-1)**lenexp
的版本莫比乌斯
SymPy 0.7.6附带的可能更高效。例如,如果发现平方因子,它可以提前停止因子分解过程。
相关的:应用数论