implement factor choose