58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
from sympy import *
|
|
|
|
def check_injective_surjective(func, var, domain, codomain):
|
|
x, y = symbols('x y')
|
|
|
|
# Check if the function is well-defined
|
|
outputs = {}
|
|
for val in domain:
|
|
output = func.subs(var, val)
|
|
if output in outputs:
|
|
# If the same output occurs for different inputs, it's not well-defined
|
|
if outputs[output] != val:
|
|
return "The function is not well-defined."
|
|
else:
|
|
outputs[output] = val
|
|
|
|
# Check injectivity
|
|
injective = True
|
|
for val1 in domain:
|
|
for val2 in domain:
|
|
if val1 != val2:
|
|
if func.subs(var, val1) == func.subs(var, val2):
|
|
injective = False
|
|
break
|
|
|
|
# Check surjectivity
|
|
surjective = True
|
|
for c_val in codomain:
|
|
try:
|
|
solutions = solve(Eq(func, c_val), var)
|
|
if not any(s in domain for s in solutions):
|
|
surjective = False
|
|
break
|
|
except:
|
|
surjective = False
|
|
break
|
|
|
|
# Results
|
|
if injective and surjective:
|
|
return "The function is bijective (both injective and surjective)."
|
|
elif injective:
|
|
return "The function is injective only."
|
|
elif surjective:
|
|
return "The function is surjective only."
|
|
else:
|
|
return "The function is neither injective nor surjective."
|
|
|
|
# Define the function and its domain/codomain
|
|
x = symbols('x')
|
|
func = Piecewise((2*x, x >= 0), (-2*x-1, x < 0))
|
|
domain = range(-20, 20) # For example, integers from -20 to 20
|
|
codomain = range(0, 40) # Adjusted codomain to include all possible outputs
|
|
|
|
result = check_injective_surjective(func, x, domain, codomain)
|
|
print(result)
|
|
|
|
print("please double check it yourself")
|