有限功能的有限集,图像和原像的成语Python实现?

时间:2018-12-28 17:21:56

标签: python discrete-mathematics

假设我在有限集之间有一个有限的具体功能。当然,Python具有本机实现的集。

但是,准确地实现集合之间的有限函数的思想的最佳方法是什么?包装好的字典?另外,如何实现图像和原像的计算? [见下文。]

对于图像,我可以清楚地使用地图。对于原像,我可以遍历域集并进行过滤。尽管如此,我仍想知道更Pythonic的惯用解决方案。

Wikipedia: Images (mathematics)

2 个答案:

答案 0 :(得分:2)

对于从一组到另一组的任意图像,我将使用Python字典。例如,在一组{1,2,3,4}上的f(n)= n ^ 2,我可以这样做:

preimage = set([1,2,3,4])
mapping = {x: x*x for x in preimage}
image = set(mapping.values())
assert set(mapping.keys()) == preimage
function = lambda x: mapping[x] # so you can now have y = function(x)
check_image = set([function(x) for x in preimage])
assert check_image == image

当然,这仅在您的有限集相对于您拥有的内存而言确实是有限的时才有效。

以上是将函数定义为映射的最一般情况。但是如果要使用可以用Python表达式表示的更简单的函数,则可以跳过字典:

preimage = set([1,2,3,4])
function = lambda x: x*x
image = set([function(x) for x in preimage])
check_preimage = set([y for x in image for y in preimage if function(y)==x])
assert check_preimage == preimage

如果还有,您可以为该域提供反函数:

import math
preimage = set([1,2,3,4])
function = lambda x: x*x
inv_func = lambda x: int(math.sqrt(x))
image = set([function(x) for x in preimage])
check_preimage = set([inv_func(x) for x in image])
assert check_preimage == preimage

请注意,以上三个不同的代码段中,只有第一个会保证您的function(x)仅允许预定义原像中的x

谈到惯用的python:我不认为python真的是一种数学语言(与Wolfram的mathematica相比),因此我们没有内置图像,映射等概念。但是,您可以在列表理解中看到上面的代码。确实,我只是像在set中一样明确地使用set([function(x) for x in preimage])关键字,但是您可以使用{function(x) for x in preimage}节省一些击键。

答案 1 :(得分:0)

def preimage(b: B, f: Dict[A, B]) -> Set[A]: 
    ''' get the preimage of one item. '''
    return set(a for a in f.keys() if f[a]==b)

假设TypeVar and other things from pep484

from typing import TypeVar, Dict, Set
A = TypeVar('A')
B = TypeVar('B')

没有类型注释,看起来像这样

def preimage(b, f): 
  ...

或共域的子集

from typing import Collection
from functools import reduce

def preimage_(bs: Collection[B], f: Dict[A, B]) -> Set[A]: 
    ''' get the preimage of a collection of items '''
    return reduce(lambda a, b: a.union(b), [preimage(b, f) for b in bs])