def clusterSubforms(self):
        #zmienic na generacje kluczy zredukowanych form
        reducedKey2nodes = {}
        subKeyList = list( self.monomials )
        reducedKey2form = {}
        
        for node in self.node2subforms:
            coeffs = []
            for subKey in subKeyList:
                coeffs.append(self.node2subforms[node][subKey])
                
            gcd = reduce(math.gcd, coeffs)
            if gcd != 1:
                form = CanonicalForm()
                subforms = self.node2subforms[node]
                for subKey in subforms:
                    form.subforms[subKey] = subforms[subKey] // gcd
                    
                reducedKey = form.generateKey()
            else:
                form = CanonicalForm()
                form.subforms = self.node2subforms[node]
                reducedKey = form.generateKey()
                
            if reducedKey in reducedKey2nodes:
                reducedKey2nodes[reducedKey].add(node)
            else:
                reducedKey2nodes[reducedKey] = set([ node ])
                reducedKey2form[reducedKey] = form
#                
        return reducedKey2nodes, reducedKey2form
    def createIntegerForm(self, node, value):
        newForm = CanonicalForm()
        newForm.subforms[1] = value

        self.graph.nodes[node]["form"] = newForm
        newKey = newForm.generateKey()
        self.graph.nodes[node]["canonicalKey"] = newKey
        self.key2uniqueOperatorNodes[newKey] = node
    def createPrimeForm(self, node):
        newSubformKey = self.subformFactory.createSubform(node)
        newForm = CanonicalForm()
        newForm.subforms[newSubformKey] = 1

        self.graph.nodes[node]["form"] = newForm
        newKey = newForm.generateKey()
        self.graph.nodes[node]["canonicalKey"] = newKey
        self.key2uniqueOperatorNodes[newKey] = node