(* ::Package:: *) oneTOone[f_,region_]:=Module[{tmp,n,sol,exp,list,y}, (* x should not be in the local var list*) Off[Solve::ratnz]; sol=Solve[f==y &®ion, x, Reals]; exp=x/.sol; list=Last@Level[#,1]&/@exp; n=Length@list; R=ParametricRegion [{{y},list[[#]]},{y}]&/@Range[n]; (*Length of R says in general how many solutions there are for y *) If[Length@R>1,False,True] ]; (*KLudge x and y ar free unbound *) onTO[f_,regionX_, regionY_]:= Module[{R,list,n,m1,exp,sol}, Off[Solve::ratnz]; sol=Solve[y-f==0&®ionX&®ionY,{x},MaxExtraConditions->All]; exp=x/.sol; list=Last@Level[#,1]&/@exp; n=Length@list; R=ParametricRegion [{{z},list[[#]]},{z}]&/@Range[n]; m1=RegionMember[RegionUnion[Sequence@R],{y}]; If[FindInstance[Not[m1]&®ionY,{y}]=={}, True, False] ]; makeFUNC[type_]:=Module[{syms,symbolsDOMAIN,symbolsRANGE,domain,range,range2,e1,e2,e1NOT,v1coor,v2coor,domainLABLE,rangeLABLE,list,list2,shift,n,index,same,drop,degen1,degen2,rand, image,preimage}, syms={CharacterRange["\[Alpha]","\[Omega]"],CharacterRange["a","z"],CharacterRange["\[CapitalAlpha]","\[CapitalOmega]"],CharacterRange["A","Z"]}; {symbolsDOMAIN,symbolsRANGE}=RandomSample[syms,2]; Which[type=="1to1 and not Onto" , domain=RandomSample[Range@Length@symbolsDOMAIN, 10]; range=RandomSample[Range@Length@symbolsRANGE, 15]; e1=RandomSample[domain,n=RandomInteger[{1,8}]]; e2=RandomSample[range,n];, type=="not 1to1 and not Onto" , domain=RandomSample[Range@Length@symbolsDOMAIN, 10]; range=RandomSample[Range@Length@symbolsRANGE, 15]; e1=RandomSample[domain,n=RandomInteger[{5,8}]]; e2=RandomSample[range,n];, type=="not 1to1 and Onto" , n=RandomInteger[{3,10}]; domain=RandomSample[Range@Length@symbolsDOMAIN, 15]; range=RandomSample[Range@Length@symbolsRANGE, n]; e1=RandomSample[domain,15]; e2=RandomSample[range,n];, type=="not function" , domain=RandomSample[Range@Length@symbolsDOMAIN, 10]; range=RandomSample[Range@Length@symbolsRANGE, 15]; e1=RandomSample[domain,n=RandomInteger[{4,8}]]; e2=RandomSample[range,n];, True, (*1to1 and onto*) n=RandomInteger[{3,15}]; domain=RandomSample[Range@Length@symbolsDOMAIN,n]; range=RandomSample[Range@Length@symbolsRANGE, n]; e1=RandomSample[domain,n]; e2=RandomSample[range,n]; ]; shift=RandomInteger[{0,2}]; (*KLUDGE: change the layout here by adjusting shift*) v1coor=Table[{0,i+shift}, {i,1,Length@domain}]; v2coor=Table[{5,i}+{0,-2}, {i,1,Length@range}]; v1coor=RandomSample[v1coor,Length@v1coor]; v2coor=RandomSample[v2coor,Length@v2coor]; domainLABLE=Table[Text[symbolsDOMAIN[[i]],v1coor[[i]]+{-0.3,0}],{i,1,Length@e1}]; rangeLABLE=Table[Text[symbolsRANGE[[range[[i]]]],v2coor[[i]]+{0.3,0}],{i,1,Length@range}]; Which[ type=="1to1 and not Onto", list=Arrow/@Table[{v1coor[[i]],v2coor[[i]]},{i,1,n}]; list=Table[Tooltip[list[[i]],"f("<>symbolsDOMAIN[[i]]<>")="<>symbolsRANGE[[range[[i]]]]], {i,1,n}]; range2=Table[symbolsRANGE[[range[[i]]]], {i,1,n}]; rand=RandomChoice@Drop[Subsets[Range@n],1]; image={symbolsDOMAIN[[rand]], symbolsRANGE[[range[[rand]]]]}; rand=RandomChoice@Drop[Subsets[Range@n],1]; preimage={symbolsDOMAIN[[rand]], symbolsRANGE[[range[[rand]]]]}; , type=="1to1 and Onto", list=Arrow/@Table[{v1coor[[i]],v2coor[[i]]},{i,1,n}]; list=Table[Tooltip[list[[i]],"f("<>symbolsDOMAIN[[i]]<>")="<>symbolsRANGE[[range[[i]]]]], {i,1,n}]; range2=Table[symbolsRANGE[[range[[i]]]], {i,1,n}]; rand=RandomChoice@Drop[Subsets[Range@n],1]; image={symbolsDOMAIN[[rand]], symbolsRANGE[[range[[rand]]]]}; rand=RandomChoice@Drop[Subsets[Range@n],1]; preimage={symbolsDOMAIN[[rand]], symbolsRANGE[[range[[rand]]]]}; , type=="not 1to1 and not Onto" , same=RandomSample[Range[n],4]; index=Range[n]; index[[same[[1]]]]=index[[same[[2]]]]; index[[same[[3]]]]=index[[same[[4]]]]; list=Arrow/@Table[{v1coor[[i]],v2coor[[index[[i]]]]},{i,1,n}]; list=Table[Tooltip[list[[i]],"f("<>symbolsDOMAIN[[i]]<>")="<>symbolsRANGE[[range[[index[[i]]]]]]], {i,1,n}]; range2=Table[symbolsRANGE[[range[[index[[i]]]]]], {i,1,n}]; rand=RandomChoice@Drop[Subsets[Range@n],1]; image=DeleteDuplicates/@{symbolsDOMAIN[[rand]], symbolsRANGE[[range[[index[[rand]]]]]]}; rand=RandomChoice@Drop[Subsets[Range@n],1]; preimage=DeleteDuplicates/@{If[ContainsAny[symbolsRANGE[[range[[index[[rand]]]]]],{symbolsRANGE[[range[[index[[#]]]]]]}]==True,symbolsDOMAIN[[#]],Nothing]&/@Range[n] , symbolsRANGE[[range[[index[[rand]]]]]]}; , type=="not 1to1 and Onto" , index=Table[If[i<=n, i, Mod[i,n]+1],{i,1,15}]; list=Arrow/@Table[{v1coor[[i]],v2coor[[index[[i]]]]},{i,1,15}]; list=Table[Tooltip[list[[i]],"f("<>symbolsDOMAIN[[i]]<>")="<>symbolsRANGE[[range[[index[[i]]]]]]], {i,1,15}]; range2=Table[symbolsRANGE[[range[[index[[i]]]]]], {i,1,15}]; rand=RandomChoice@Drop[Subsets[Range@5],1]; image=DeleteDuplicates/@{symbolsDOMAIN[[rand]], symbolsRANGE[[range[[index[[rand]]]]]]}; rand=RandomChoice@Drop[Subsets[Range@5],1]; preimage=DeleteDuplicates/@{If[ContainsAny[symbolsRANGE[[range[[index[[rand]]]]]],{symbolsRANGE[[range[[index[[#]]]]]]}]==True,symbolsDOMAIN[[#]],Nothing]&/@Range[15] , symbolsRANGE[[range[[index[[rand]]]]]]}; , type=="not function" , n=RandomChoice@{n,n-1}; list=Table[{v1coor[[i]],v2coor[[i]]},{i,1,n}]; {degen1,degen2}=RandomSample[Range[2,Length@list],2]; list=list~Join~{{list[[degen1]][[1]],list[[degen2]][[2]]}}; list=Arrow/@list; list2=Table[Tooltip[list[[i]],"f("<>symbolsDOMAIN[[i]]<>")="<>symbolsRANGE[[range[[i]]]]], {i,1,Length@list-1}]; list=list2~Join~{Tooltip[list[[Length@list]],"f("<>symbolsDOMAIN[[degen1]]<>")="<>symbolsRANGE[[range[[degen2]]]]]}; (*list=Drop[list,{RandomInteger[{2,Length@list-2}]}];*) ]; Which[type=="types", {"not function" ,"not 1to1 and Onto","not 1to1 and not Onto" ,"1to1 and Onto","1to1 and not Onto"}, type=="not function", <| "plot"->Graphics[{Opacity@0,Point[v1coor],Point[v2coor],Opacity@1,domainLABLE,rangeLABLE,Blue,list},ImageSize->200], "domain"->symbolsDOMAIN[[Range[Length@e1]]], "range"->symbolsRANGE[[range]] |>, True, <| "plot"->Graphics[{Opacity@0,Point[v1coor],Point[v2coor],Opacity@1,domainLABLE,rangeLABLE,Blue,list},ImageSize->200], "domain"->symbolsDOMAIN[[Range[Length@e1]]], "range"->DeleteDuplicates@range2, "rangeALL"->symbolsRANGE[[range]], "image"->image, "preimage"->preimage |>] ];