格雷码

class sympy.combinatorics.graycode.GrayCode(n, *args, **kw_args)[源代码][源代码]

格雷码本质上是在一个边长为一的n维立方体上的哈密顿路径。立方体的顶点由二进制值的向量表示。哈密顿路径恰好访问每个顶点一次。3维立方体的格雷码是[‘000’,’100’,’110’,’010’,’011’,’111’,’101’, ‘001’]。

格雷码解决了按顺序生成所有可能的 n 个对象子集的问题,使得每个子集都是通过删除或添加单个对象从前一个子集获得的。在上面的例子中,1 表示对象存在,0 表示对象不存在。

格雷码在统计学中也有应用,当我们想要以高效的方式计算与子集相关的各种统计数据时。

属性:
args

返回 ‘self’ 的参数元组。

assumptions0

返回对象 \(type\) 假设。

canonical_variables

返回一个字典,将 self.bound_symbols 中定义的任何变量映射到与表达式中任何自由符号不冲突的符号。

current

返回当前引用的格雷码作为位字符串。

expr_free_symbols
free_symbols

从自身的原子中返回那些自由符号。

func

表达式中的顶级函数。

is_algebraic
is_antihermitian
is_commutative
is_comparable

如果 self 可以计算为一个具有精度的实数(或已经是一个实数),则返回 True,否则返回 False。

is_complex
is_composite
is_even
is_extended_negative
is_extended_nonnegative
is_extended_nonpositive
is_extended_nonzero
is_extended_positive
is_extended_real
is_finite
is_hermitian
is_imaginary
is_infinite
is_integer
is_irrational
is_negative
is_noninteger
is_nonnegative
is_nonpositive
is_nonzero
is_odd
is_polar
is_positive
is_prime
is_rational
is_real
is_transcendental
is_zero
n

返回格雷码的维度。

rank

对格雷码进行排序。

selections

返回格雷码中位向量的数量。

方法

as_content_primitive([radical, clear])

一个存根,允许在计算表达式的内容和基本组件时跳过基本参数(如元组)。

as_dummy()

返回表达式,其中任何具有结构绑定符号的对象都被替换为在其出现的对象中唯一的规范符号,并且仅对交换性具有默认假设为True。

atoms(*types)

返回构成当前对象的原子。

class_key()

类的好顺序。

compare(other)

如果对象在规范意义上小于、等于或大于其他对象,则返回 -1、0、1。

count(query)

计算匹配的子表达式的数量。

count_ops([visual])

用于返回操作计数的 count_ops 的包装器。

doit(**hints)

评估默认情况下不评估的对象,如极限、积分、求和和乘积。

dummy_eq(other[, symbol])

比较两个表达式并处理哑符号。

find(query[, group])

查找所有匹配查询的子表达式。

fromiter(args, **assumptions)

从可迭代对象创建一个新对象。

generate_gray(**hints)

生成格雷码的位向量序列。

has(*patterns)

测试是否有任何子表达式匹配任何模式。

has_free(*patterns)

如果 self 包含对象 x 作为自由表达式,则返回 True,否则返回 False。

has_xfree(s)

如果 self 有 s 中的任何一个模式作为自由参数,则返回 True,否则返回 False。

is_same(b[, approx])

如果 a 和 b 结构相同则返回 True,否则返回 False。

match(pattern[, old])

模式匹配。

matches(expr[, repl_dict, old])

用于 match() 的辅助方法,用于在 self 中的通配符符号与 expr 中的表达式之间寻找匹配。

next([delta])

返回当前值在规范顺序中距离 ``delta``(默认 = 1)的格雷码。

rcall(*args)

通过表达式树递归应用于参数。

refine([assumption])

请参阅 sympy.assumptions 中的 refine 函数。

replace(query, value[, map, simultaneous, exact])

self 中匹配的子表达式替换为 value

rewrite(*args[, deep])

使用定义的规则重写 self

simplify(**kwargs)

请参阅 sympy.simplify 中的 simplify 函数。

skip()

跳过位生成。

sort_key([order])

返回一个排序键。

subs(*args, **kwargs)

在简化参数后,在表达式中用新内容替换旧内容。

unrank(n, rank)

取消排名为 k 的 n 位大小的格雷码。

xreplace(rule)

替换表达式中对象的出现。

复制

could_extract_minus_sign

is_hypergeometric

参考文献

[1]

Nijenhuis,A. 和 Wilf,H.S. (1978). 组合算法. 学术出版社.

[2]

Knuth, D. (2011). 计算机程序设计艺术, 卷4 Addison Wesley

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(3)
>>> list(a.generate_gray())
['000', '001', '011', '010', '110', '111', '101', '100']
>>> a = GrayCode(4)
>>> list(a.generate_gray())
['0000', '0001', '0011', '0010', '0110', '0111', '0101', '0100',     '1100', '1101', '1111', '1110', '1010', '1011', '1001', '1000']
property current

返回当前引用的格雷码作为位字符串。

示例

>>> from sympy.combinatorics import GrayCode
>>> GrayCode(3, start='100').current
'100'
generate_gray(**hints)[源代码][源代码]

生成格雷码的位向量序列。

参见

skip

参考文献

[1]

Knuth, D. (2011). 计算机程序设计艺术, 卷4, Addison Wesley

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(3)
>>> list(a.generate_gray())
['000', '001', '011', '010', '110', '111', '101', '100']
>>> list(a.generate_gray(start='011'))
['011', '010', '110', '111', '101', '100']
>>> list(a.generate_gray(rank=4))
['110', '111', '101', '100']
property n

返回格雷码的维度。

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(5)
>>> a.n
5
next(delta=1)[源代码][源代码]

返回当前值在规范顺序中距离 ``delta``(默认 = 1)的格雷码。

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(3, start='110')
>>> a.next().current
'111'
>>> a.next(-1).current
'010'
property rank

对格雷码进行排序。

排名算法决定了组合对象在给定顺序下相对于所有对象的位置(或排名)。例如,4位二进制反射格雷码(BRGC)’0101’的排名为6,因为它在4位格雷码族的标准顺序中位于第6位。

参见

unrank

参考文献

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(3)
>>> list(a.generate_gray())
['000', '001', '011', '010', '110', '111', '101', '100']
>>> GrayCode(3, start='100').rank
7
>>> GrayCode(3, rank=7).current
'100'
property selections

返回格雷码中位向量的数量。

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(3)
>>> a.selections
8
skip()[源代码][源代码]

跳过位生成。

参见

generate_gray

示例

>>> from sympy.combinatorics import GrayCode
>>> a = GrayCode(3)
>>> for i in a.generate_gray():
...     if i == '010':
...         a.skip()
...     print(i)
...
000
001
011
010
111
101
100
classmethod unrank(n, rank)[源代码][源代码]

取消一个 n 位大小的格雷码的排名 k。此方法的存在是为了让派生的 GrayCode 类可以定义其自己的给定排名的代码。

这里的字符串是按相反顺序生成的,以允许尾调用优化。

参见

rank

示例

>>> from sympy.combinatorics import GrayCode
>>> GrayCode(5, rank=3).current
'00010'
>>> GrayCode.unrank(5, 3)
'00010'
graycode.random_bitstring()[源代码]

生成一个长度为 n 的随机位列表。

示例

>>> from sympy.combinatorics.graycode import random_bitstring
>>> random_bitstring(3) 
100
graycode.gray_to_bin()[源代码]

从格雷码转换为二进制码。

我们假设大端编码。

参见

bin_to_gray

示例

>>> from sympy.combinatorics.graycode import gray_to_bin
>>> gray_to_bin('100')
'111'
graycode.bin_to_gray()[源代码]

从二进制编码转换为格雷编码。

我们假设大端编码。

参见

gray_to_bin

示例

>>> from sympy.combinatorics.graycode import bin_to_gray
>>> bin_to_gray('111')
'100'
graycode.get_subset_from_bitstring(bitstring)[源代码]

获取由位串定义的子集。

示例

>>> from sympy.combinatorics.graycode import get_subset_from_bitstring
>>> get_subset_from_bitstring(['a', 'b', 'c', 'd'], '0011')
['c', 'd']
>>> get_subset_from_bitstring(['c', 'a', 'c', 'c'], '1100')
['c', 'a']
graycode.graycode_subsets()[源代码]

生成由格雷码枚举的子集。

示例

>>> from sympy.combinatorics.graycode import graycode_subsets
>>> list(graycode_subsets(['a', 'b', 'c']))
[[], ['c'], ['b', 'c'], ['b'], ['a', 'b'], ['a', 'b', 'c'],     ['a', 'c'], ['a']]
>>> list(graycode_subsets(['a', 'b', 'c', 'c']))
[[], ['c'], ['c', 'c'], ['c'], ['b', 'c'], ['b', 'c', 'c'],     ['b', 'c'], ['b'], ['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'c', 'c'],     ['a', 'b', 'c'], ['a', 'c'], ['a', 'c', 'c'], ['a', 'c'], ['a']]