def is_subgroup(self, other): r""" Return True if self is a subgroup of right, and False otherwise. EXAMPLES:: sage: GammaH(24,[7]).is_subgroup(SL2Z) True sage: GammaH(24,[7]).is_subgroup(Gamma0(8)) True sage: GammaH(24, []).is_subgroup(GammaH(24, [7])) True sage: GammaH(24, []).is_subgroup(Gamma1(24)) True sage: GammaH(24, [17]).is_subgroup(GammaH(24, [7])) False sage: GammaH(1371, [169]).is_subgroup(GammaH(457, [169])) True """ from all import is_Gamma0, is_Gamma1 if not isinstance(other, GammaH_class): raise NotImplementedError # level of self should divide level of other if self.level() % other.level(): return False # easy cases if is_Gamma0(other): return True # recall self is a GammaH, so it's contained in Gamma0 if is_Gamma1(other) and len(self._generators_for_H()) > 0: return False else: # difficult case t = other._list_of_elements_in_H() for x in self._generators_for_H(): if not (x in t): return False return True