That's, perhaps, where using Mul atoms is better. But...I guess you would have to loop/filter them to get ones that were not numbers (like 2*sqrt(3)); you need Muls with symbols: `muls = [m for min factor.atoms(Mul) if m.free_symbols]`