## The Spotlight Factor

In my Handbook of Writing for the Mathematical Sciences I described the spotlight factor, originally introduced by Tompa in 1989. The spotlight factor is defined for the first author of a paper in which there are $n$ authors listed alphabetically, and it is assumed that the paper is from a community where it is the custom to order authors alphabetically.

The spotlight factor is the probability that if $n-1$ coauthors are chosen independently at random they will all have surnames later in the alphabet than the first author. This definition is not precise, since it is not clear what is the sample space of all possible names, so it is better to regard the spotlight factor as being defined by the formula given by Tompa, which is implemented in the MATLAB function below.

The smallest spotlight factor I have found is the value 0.0244 for Zielinski, for the paper

Pawel Zielinski and Krystyna Zietak, The Polar Decomposition—Properties, Applications and Algorithms, Applied Mathematics, Ann. Pol. Math. Soc. 38, 23-49, 1995

This beats the best factor of 0.0251 reported by Tompa in a 1990 follow-up paper.

Can you do better?

Here is a MATLAB M-file to compute the spotlight factor, preceded by an example of its usage:

```>> spotlight('zielinski',1)
ans =
2.4414e-02
```
```function s = spotlight(x, k)
%SPOTLIGHT   Tompa's spotlight factor of authorship.
%   SPOTLIGHT(X, K) is the spotlight factor for the author whose
%   last name is specified in the string X, with K coauthors.
%   Mixed upper and lower case can be used.
%   Smaller spotlight factors correspond to rarer events.

%   Reference:
%   Martin Tompa, Figures of Merit, SIGACT News 20 (1), 62-71, 1989

if ~ischar(x), error('First argument must be a string.'), end
if nargin < 2, error('Must give two arguments.'), end

x = double(upper(x)) - double('A') + 1;
x( find(x < 0 | x > 26) ) = 0;  % Handle punctuation and spaces.

s = 0;

% Ideally use Horner's rule, but the following is clearer.

for i=1:length(x)
t = x(i);
s = s + t/27^i;
end

s = (1 - s)^k;
```
This entry was posted in writing and tagged . Bookmark the permalink.

### 3 Responses to The Spotlight Factor

1. Vedran Sego says:

Can you do better?

Almost by a factor 10:
Zybarev, E.Yu.; Zybarev, Yu.M., “Petri nets as a language of specifications of discrete systems.
0.002639

Python 3 version of the above code (comments removed for brevity):

```def spotlight(x, k):
if not isinstance(x, str):
raise ValueError('First argument must be a string.')

x = [ ord(c) - 64 if 'A' <= c <= 'Z' else 0 for c in x.upper() ]

s = 0;

for i in range(len(x)):
t = x[i]
s = s + t / 27**(i+1);
return (1 - s)**k;
```

Btw, shouldn’t spaces and punctuation be removed, and not just treated as zeroes?

2. Nick Higham says:

That one will be hard to beat, Tompa states “blanks and punctuation represent zero”.

3. Steve L says:

I don’t know of a paper with a smaller spotlight factor, but I do know of one or two MATLAB functions that make the code you posted a bit shorter. [Whether they make the code clearer or not is an open question.] The FLIP (or you could use FLIPLR) call is necessary in this approach since the higher powers of (1/27) are associated with the later letters in the last name. By flipping it, coeffs is now in the form POLYVAL expects. I checked this code with Zielinski and Zybarev and the results agreed with Nick and Vedran’s answers.

function spotFactor = spotlight(lastName, numCoauthors)

narginchk(2, 2);
assert(ischar(lastName), ‘First input must be a char array’);

nameNums = zeros(size(lastName));
findLetters = isletter(lastName);
nameNums(findLetters) = upper(lastName(findLetters))-‘A’+1;

coeffs = flip(nameNums, 2);
s = (1/27)*polyval(coeffs, (1/27));
spotFactor = (1-s)^numCoauthors;