def get_score_bj_fast(n_alpha: np.ndarray, no_records: np.ndarray, alpha: np.ndarray) -> np.ndarray:
        """
        BerkJones

        :param n_alpha: Number of records less than alpha.
        :param no_records: Number of records.
        :param alpha: Alpha threshold.
        :return: Score.
        """
        score = np.zeros(alpha.shape[0])
        inds_tie = n_alpha == no_records
        inds_not_tie = np.logical_not(inds_tie)
        inds_pos = n_alpha > no_records * alpha
        inds_pos_not_tie = np.logical_and(inds_pos, inds_not_tie)
        score[inds_tie] = no_records[inds_tie] * np.log(np.true_divide(1, alpha[inds_tie]))

        factor1 = n_alpha[inds_pos_not_tie] * np.log(
            np.true_divide(
                n_alpha[inds_pos_not_tie],
                no_records[inds_pos_not_tie] * alpha[inds_pos_not_tie],
            )
        )

        factor2 = no_records[inds_pos_not_tie] - n_alpha[inds_pos_not_tie]

        factor3 = np.log(
            np.true_divide(
                no_records[inds_pos_not_tie] - n_alpha[inds_pos_not_tie],
                no_records[inds_pos_not_tie] * (1 - alpha[inds_pos_not_tie]),
            )
        )

        score[inds_pos_not_tie] = factor1 + factor2 * factor3
        return score

        BerkJones

        :param n_alpha: Number of records less than alpha.
        :param no_records: Number of records.
        :param alpha: Alpha threshold.
        :return: Score.
        
art/defences/detector/evasion/subsetscanning/scoring_functions.py