def projective_plane(n, check=True, existence=False): r""" Return a projective plane of order ``n`` as a 2-design. A finite projective plane is a 2-design with `n^2+n+1` lines (or blocks) and `n^2+n+1` points. For more information on finite projective planes, see the :wikipedia:`Projective_plane#Finite_projective_planes`. If no construction is possible, then the function raises a ``EmptySetError`` whereas if no construction is available the function raises a ``NotImplementedError``. INPUT: - ``n`` -- the finite projective plane's order EXAMPLES:: sage: designs.projective_plane(2) (7,3,1)-Balanced Incomplete Block Design sage: designs.projective_plane(3) (13,4,1)-Balanced Incomplete Block Design sage: designs.projective_plane(4) (21,5,1)-Balanced Incomplete Block Design sage: designs.projective_plane(5) (31,6,1)-Balanced Incomplete Block Design sage: designs.projective_plane(6) Traceback (most recent call last): ... EmptySetError: By the Bruck-Ryser theorem, no projective plane of order 6 exists. sage: designs.projective_plane(10) Traceback (most recent call last): ... EmptySetError: No projective plane of order 10 exists by C. Lam, L. Thiel and S. Swiercz "The nonexistence of finite projective planes of order 10" (1989), Canad. J. Math. sage: designs.projective_plane(12) Traceback (most recent call last): ... NotImplementedError: If such a projective plane exists, we do not know how to build it. sage: designs.projective_plane(14) Traceback (most recent call last): ... EmptySetError: By the Bruck-Ryser theorem, no projective plane of order 14 exists. TESTS:: sage: designs.projective_plane(2197, existence=True) True sage: designs.projective_plane(6, existence=True) False sage: designs.projective_plane(10, existence=True) False sage: designs.projective_plane(12, existence=True) Unknown """ from sage.rings.sum_of_squares import is_sum_of_two_squares_pyx if n <= 1: if existence: return False raise EmptySetError("There is no projective plane of order <= 1") if n == 10: if existence: return False ref = ("C. Lam, L. Thiel and S. Swiercz \"The nonexistence of finite " "projective planes of order 10\" (1989), Canad. J. Math.") raise EmptySetError("No projective plane of order 10 exists by %s"%ref) if (n%4) in [1,2] and not is_sum_of_two_squares_pyx(n): if existence: return False raise EmptySetError("By the Bruck-Ryser theorem, no projective" " plane of order {} exists.".format(n)) if not is_prime_power(n): if existence: return Unknown raise NotImplementedError("If such a projective plane exists, we do " "not know how to build it.") if existence: return True else: return DesarguesianProjectivePlaneDesign(n, point_coordinates=False, check=check)