Query the FDB by ID to analyze if the corresponding number may mutate by assuming
     the composite is of the given `forms`, where `forms` is a list of `form`s as used by
     the mfaliquot.aliquot.composite_tau_lte function. The optional n and guide arguments
     are for error checking purposes.

def examine_seq(id, forms=None, n=None, guide=None, seq=None):
     '''Query the FDB by ID to analyze if the corresponding number may mutate by assuming
     the composite is of the given `forms`, where `forms` is a list of `form`s as used by
     the mfaliquot.aliquot.composite_tau_lte function. The optional n and guide arguments
     are for error checking purposes.'''
     primes, comps = get_id_info(id)
     if len(comps) == 0:
          return None # json data for this seq is out of date
     if len(comps) > 1 or list(comps.values()) != [1]:
          raise ValueError("Wtf?!? two composites or composite to a power? seq {}, id {}".format(seq.seq, seq.id))
     c = int(list(comps.keys())[0])
     guideprime, s, t = aq.canonical_form(primes)

     # We do a cross check that the fdb and data file agree: to do this,
     # we cut primes >9 digits from the fdb data
     nprime = {p: a for p, a in primes.items() if len(str(p)) <= 9}
     if (n is not None and nprime != n) or (guide is not None and guideprime != guide):
          #raise ValueError("Disagreement between local file and fdb: {} {}".format(n, nprime))
          print("Weird! Seq {} apparently is bad info in the data file.".format(seq.seq if seq else None))
          return None

     return aq.mutation_possible(primes, c, forms)